c# - stringbuilder 保存到 CSV 文件时内存不足

标签 c# csv datatable stringbuilder

我需要将大型数据表(5000 行和 8880 列)保存到 CSV 文件。因此,我首先将 DataTable 保存到 StringBuilder 并使用 File.WriteAllText 保存到文件。但由于表的大小,它给了我内存不足异常。我正在考虑使用 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());

最佳答案

不要使用File.WriteAllText(),因为它想要内存中的所有数据,请使用File.WriteAllLines() 相反(它只需要一行内存):

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

关于c# - stringbuilder 保存到 CSV 文件时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35654830/

相关文章:

c# - 通过 URL 自动登录用户

c# - 如何将字符串拆分为字典

python - 如何将 Postgres 结果集作为 CSV 从远程数据库连接导出到本地机器?

php - 在 PHP 上解析来自 base64 的 csv 文件

python - 替代 "write to file"使用 COPY 将 CSV 数据传输到 PostgreSQL 以获得更好的性能?

c# - GroupBy() 获取重复记录

vb.net - DataTable.GetChanges() 是否可以通过引用获取行?

java - Primefaces 数据表选择行和范围

c# - 仅对数据表中的选定行求和?

c# - IAsyncActionFilter 中的 ParameterDescriptor 上的 GetCustomAttributes 丢失