C# - 如何将DataTable的Schema转换为CSV字符串?

时间:2016-09-20 18:54:14

标签: c# linq csv datatable

我想采用DataTable的架构并将其导入逗号分隔的字符串。到目前为止,我有如下所示的代码,但如果可能的话,我真的希望这是一个单行解决方案。

List<string> columns = new List<string>();
foreach (var column in MyDataTable.Columns)
    columns.Add(column.ToString());

string schema = string.Join(",", columns);

有更简洁的方法吗?

2 个答案:

答案 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);
    }
}