2016-09-20 94 views
0

我想采用DataTable的模式并将其导入逗号分隔的字符串中。到目前为止,我的代码如下所示,但如果可能的话,我真的很希望这是一个单线程的解决方案。C# - 如何将DataTable的Schema转换为CSV字符串?

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

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

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

+0

不要忘记考虑名称中包含空格或其他特殊字符的列。 –

+1

“单行”不是更好。他们通常会牺牲可读性/可维护性。上述解决方案看起来易读并且可维护。去那。 –

+0

我的意思是,你可以,但我同意萨姆。我也不是在'foreach'声明中不包括'{'和'}'的巨大粉丝,但是哦。 'var schema = string.Join(“,”,MyDataTable.Columns.Cast ().Select(r => r.ColumnName));'如果这真的是你想要的更简洁。 – KSib

回答

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

'string.Join(分隔符,dr.ItemArray)'比你的内部循环快得多。 –

+0

@Matthew在查看代码后我会同意。 –

0

使用

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