c# -如何将数据表的Schema转换成CSV字符串

本文关键字:转换 Schema CSV 字符串 数据表 | 更新日期: 2023-09-27 18:08:01

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

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

是否有更简洁的方法来做到这一点?

c# -如何将数据表的Schema转换成CSV字符串

之前的文章很好地回答了这个问题。

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();
}

用法

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