我需要将大型数据表( 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());
答案 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
。第一列是名称,然后是值