使用
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