2011-02-03 149 views
3

請讓我知道,如果有任何方法從DataTable或DataSet生成CSV文件?具體而言,無需手動迭代DataTable行並連接。將DataSet DataTable轉換爲CSV

請幫

+0

爲什麼你不想迭代DataTable的行?這將是非常直接的... – 2011-02-03 09:39:15

+0

我正在尋找更快捷的方法。 – AbrahamJP 2011-02-03 10:00:42

+0

你可以查看這個https://gist.github.com/riyadparvez/4467668 – user 2013-03-12 07:04:38

回答

9

有幾種方法可以做到這一點。

一個最簡單(IMO)使用FileHelpers Library

FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename); 
2

還有就是,我希望,也是這樣做的一種可能方式:

static void Main(string[] args) 
    { 
     DataTable dt = new DataTable("MyTable"); 
     dt.Columns.Add("Id", typeof(int)); 
     dt.Columns.Add("Name", typeof(string)); 
     DataRow dr1 = dt.NewRow(); 
     dr1["Id"] = 1; 
     dr1["Name"] = "John Smith"; 
     dt.Rows.Add(dr1); 
     DataRow dr2 = dt.NewRow(); 
     dr2["Id"] = 2; 
     dr2["Name"] = "John West"; 
     dt.Rows.Add(dr2); 

     List<DataRow> list = dt.AsEnumerable().ToList(); 
     var strlist = from dr in list 
         select dr[0] + ", " + dr[1]; 
     var csv = string.Join(Environment.NewLine,strlist); 
     Console.WriteLine(csv); 
    } 
1

所以這是一個相當奇怪的解決方案,但它使用JSON.net庫的序列化比大多數工作更快。這大大加快了解決方案的速度。

步驟:

  1. 在數據表中創建的每一個列名的數組,應該是 簡單
  2. 使用JSON.net到數據錶轉換成JSON字符串

    string json = JsonConvert.SerializeObject(dt, Formatting.None);

  3. 開始使用C#字符串上的Replace函數,並去除所有json的json字符串中的 消光。

    json = json.Replace("\"", "").Replace("},{", "\n").Replace(":", "").Replace("[{", "").Replace("}]", "");

  4. 然後使用該陣列從步驟1到從 JSON字符串中刪除所有的列名。你留下一個csv格式的字符串。

  5. 考慮使用在步驟1中創建的陣列再以CSV格式的第一行添加的列名 。

3

的相對簡單,緊湊並且相當靈活的解決方案可能是下面的擴展方法:

public static string ToCsv(this DataTable table, string colSep = "", string rowSep = "\r\n") 
{ 
    var format = string.Join(colSep, Enumerable.Range(0, table.Columns.Count) 
              .Select(i => string.Format("{{{0}}}", i))); 

    return string.Join(rowSep, table.Rows.OfType<DataRow>() 
             .Select(i => string.Format(format, i.ItemArray))); 
} 

請注意,這種解決方案可能會導致巨大的數據量,在這種情況下,你應該流問題輸出。引用和格式化當然會使代碼更復雜。

0
//Dataset To Xls 
ExportDataSetToCsvFile(DS,@"C:\\"); 

internal static void ExportDataSetToCsvFile(DataSet _DataSet, string DestinationCsvDirectory) 
{ 
    try 
    { 
     foreach (DataTable DDT in _DataSet.Tables) 
     { 
      String MyFile = @DestinationCsvDirectory + "\\_" + DDT.TableName.ToString() + DateTime.Now.ToString("yyyyMMddhhMMssffff") + ".csv";//+ DateTime.Now.ToString("ddMMyyyyhhMMssffff") 
      using (var outputFile = File.CreateText(MyFile)) 
      { 
       String CsvText = string.Empty; 

       foreach (DataColumn DC in DDT.Columns) 
       { 
        if (CsvText != "") 
         CsvText = CsvText + "," + DC.ColumnName.ToString(); 
        else 
         CsvText = DC.ColumnName.ToString(); 
       } 
       outputFile.WriteLine(CsvText.ToString().TrimEnd(',')); 
       CsvText = string.Empty; 

       foreach (DataRow DDR in DDT.Rows) 
       { 
        foreach (DataColumn DCC in DDT.Columns) 
        { 
         if (CsvText != "") 
          CsvText = CsvText + "," + DDR[DCC.ColumnName.ToString()].ToString(); 
         else 
          CsvText = DDR[DCC.ColumnName.ToString()].ToString(); 
        } 
        outputFile.WriteLine(CsvText.ToString().TrimEnd(',')); 
        CsvText = string.Empty; 
       } 
       System.Threading.Thread.Sleep(1000); 
      } 
     } 
    } 
    catch (Exception Ex) 
    { 
     throw Ex; 
    } 
}