2016-09-20 88 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); 
    } 
}