使用
MyDataTable.ToCsvFile("mycsv.csv")
... ...代碼
注:這將是比其他幾個例子稍微慢一點,但它是符合正確如RFC 4180中的CSV轉義
public static class CsvFileEx
{
public static void ToCsvFile(this DataTable dt, string filename, bool includeHeaders = true)
{
dt.ToCsvLines(includeHeaders: includeHeaders).WriteAsLinesToFile(filename);
}
public static IEnumerable<string> ToCsvLines(this DataTable dt, string seperator = @"""", bool includeHeaders = true)
{
if (includeHeaders)
yield return string.Join(seperator, dt.Columns
.Cast<DataColumn>()
.Select(dc => @"""" + dc.ColumnName.Replace(@"""", @"""""") + @""""));
foreach (var row in dt.Rows.Cast<DataRow>())
yield return string.Join(seperator, row.ItemArray
.Select(i => @"""" + (i ?? "").ToString().Replace(@"""", @"""""") + @""""));
}
public static void WriteAsLinesToFile(this IEnumerable<string> lines, string filename)
{
using (var writer = new StreamWriter(filename))
foreach (var line in lines)
writer.WriteLine(line);
}
}
不要忘記考慮名稱中包含空格或其他特殊字符的列。 –
「單行」不是更好。他們通常會犧牲可讀性/可維護性。上述解決方案看起來易讀並且可維護。去那。 –
我的意思是,你可以,但我同意薩姆。我也不是在'foreach'聲明中不包括'{'和'}'的巨大粉絲,但是哦。 'var schema = string.Join(「,」,MyDataTable.Columns.Cast().Select(r => r.ColumnName));'如果這真的是你想要的更簡潔。 –
KSib