stringbuilder 保存到内存不足的 CSV 文件
stringbuiler save to CSV file out of memory
我需要将大数据 table(5000 行和 8880 列)保存到 CSV 文件。所以我先将 DataTable
保存到 StringBuilder
并使用 File.WriteAllText
保存到文件。但是由于 table 的 size,它给了我 out of memory exception。我正在考虑使用 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());
试试这个已经过测试并且工作正常:
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
的文件。第一列名称,然后是值
不要使用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);
我需要将大数据 table(5000 行和 8880 列)保存到 CSV 文件。所以我先将 DataTable
保存到 StringBuilder
并使用 File.WriteAllText
保存到文件。但是由于 table 的 size,它给了我 out of memory exception。我正在考虑使用 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());
试试这个已经过测试并且工作正常:
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
的文件。第一列名称,然后是值
不要使用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);