我想采用DataTable的架构并将其导入逗号分隔的字符串。到目前为止,我有如下所示的代码,但如果可能的话,我真的希望这是一个单行解决方案。
List<string> columns = new List<string>();
foreach (var column in MyDataTable.Columns)
columns.Add(column.ToString());
string schema = string.Join(",", columns);
有更简洁的方法吗?
答案 0 :(得分:0)
这篇上一篇文章很好地回答了这个问题。
https://stackoverflow.com/a/28503521/1572750
public static string DataTableToCSV(this DataTable datatable, char seperator)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < datatable.Columns.Count; i++)
{
sb.Append(datatable.Columns[i]);
if (i < datatable.Columns.Count - 1)
sb.Append(seperator);
}
sb.AppendLine();
foreach (DataRow dr in datatable.Rows)
{
for (int i = 0; i < datatable.Columns.Count; i++)
{
sb.Append(dr[i].ToString());
if (i < datatable.Columns.Count - 1)
sb.Append(seperator);
}
sb.AppendLine();
}
return sb.ToString();
}
答案 1 :(得分:0)
用法
MyDataTable.ToCsvFile("mycsv.csv")
...代码......
注意:这会比其他几个示例稍慢,但它符合RFC 4180中正确的转义
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);
}
}