将DataSet \ DataTable转换为CSV

如果有办法从DataTable或DataSet生成CSV文件,请告诉我? 具体而言,无需手动迭代DataTable行和连接。

请帮忙

有几种方法可以做到这一点。

最简单的(IMO)之一是使用FileHelpers Library

 FileHelpers.CsvEngine.DataTableToCsv(dataTable, filename); 

一个相对简单,紧凑和非常灵活的解决方案可以是以下扩展方法:

 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() .Select(i => string.Format(format, i.ItemArray))); } 

请注意,此解决方案可能会导致大量数据出现问题,在这种情况下,您应该对输出进行流式处理。 引用和格式化当然会使代码更复杂。

我希望,还有一种可能的方法:

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

所以这是一个相当奇怪的解决方案,但它比大多数工作都快,因为它使用了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格式的第一行。

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