stringbuiler保存到CSV文件内存不足

时间:2016-02-26 14:52:27

标签: c# csv datatable stringbuilder

我需要将大型数据表( 5000 行和 8880 列)保存到CSV文件。因此,我先将DataTable保存到StringBuilder,然后使用File.WriteAllText保存到文件。但是由于表的 size ,它给了我内存不足。我正在考虑使用StreamWriter。任何人都可以帮助如何使用StreamWriter吗?

谢谢!

 StringBuilder sb = new StringBuilder();

        string[] CSVcolumnNames = sortedDT.Columns.Cast<DataColumn>().
                                          Select(column => column.ColumnName).
                                          ToArray();
        sb.AppendLine(string.Join(",", CSVcolumnNames));

        foreach (DataRow row in sortedDT.Rows)
        {
            string[] fields = row.ItemArray.Select(field => field.ToString()).
                                            ToArray();
            sb.AppendLine(string.Join(",", fields));
        }

        File.WriteAllText(CSVpath, sb.ToString());

2 个答案:

答案 0 :(得分:3)

请勿使用所有 内存中的数据File.WriteAllText(),而是使用File.WriteAllLines()代替 1行仅限):

var source = sortedDT.Rows
  .OfType<DataRow>() 
  .Select(row => String.Join(",", row.ItemArray));

File.WriteAllLines(CSVpath, source);

如您所见,File.WriteAllLines为您做了一切,您不必使用StreamWriter。如果您想要添加标题(列名称):

var columnNames = String.Join(",", sortedDT.Columns
  .OfType<DataColumn>()
  .Select(column => column.ColumnName));

var data = sortedDT.Rows
  .OfType<DataRow>() 
  .Select(row => String.Join(",", row.ItemArray));

var source = new String[] {columnNames}
  .Concat(data);

File.WriteAllLines(CSVpath, source);

答案 1 :(得分:1)

试试这个经过测试并且工作正常:

       using System.IO;

        using (var sw = new StreamWriter(CSVpath))
        {
            sw.WriteLine(string.Join(",", sortedDT.Columns.Cast<DataColumn>().Select(column => column.ColumnName)));

            foreach (DataRow row in sortedDT.Rows)
            {
               sw.WriteLine(string.Join(",", row.ItemArray.Select(field => field.ToString())));

            }
        }

此代码将fields行写入文件名CSVpath。第一列是名称,然后是值