我使用下面的代码将DataTable导出为Csv文件。
public static void DataTableToCsv(System.Data.DataTable dt, string csvFile)
{
try
{
StringBuilder sb = new StringBuilder();
var columnNames = dt.Columns.Cast<DataColumn>().Select(column => """ + column.ColumnName.Replace(""", """") + """).ToArray();
sb.AppendLine(string.Join("t", columnNames));
foreach (DataRow row in dt.Rows) // Out of Memory Exception Here
{
var fields = row.ItemArray.Select(field => """ + field.ToString().Replace(""", """") + """).ToArray();
sb.AppendLine(string.Join("t", fields));
}
TextWriter sUrl = new StreamWriter(csvFile, true, Encoding.Unicode);
sUrl.WriteLine(sb.ToString());
sUrl.Close();
}
catch (Exception ex)
{
throw;
}
}
基本上,我将数百个工作表在一个文件夹合并到一个DataTable,这些工作表有不同的和共同的列等。因此,总行数变得非常大,超过50万,甚至100万。
使用上面的代码我得到Out Of Memory Exception
。有什么建议吗?
将每个CSV行单独写出来,而不是将它们组合到单个巨大的StringBuilder缓冲区中。
在你使用"sb.AppendLine()"的地方,用" surf . writeline()"代替。例如:
public static void DataTableToCsv(System.Data.DataTable dt, string csvFile)
{
try
{
using (TextWriter sUrl = new StreamWriter(csvFile, true, Encoding.Unicode))
{
var columnNames = dt.Columns.Cast<DataColumn>().Select(column => """ + column.ColumnName.Replace(""", """") + """).ToArray();
sUrl.WriteLine(string.Join("t", columnNames));
foreach (DataRow row in dt.Rows) // Out of Memory Exception Here
{
var fields = row.ItemArray.Select(field => """ + field.ToString().Replace(""", """") + """).ToArray();
sUrl.WriteLine(string.Join("t", fields));
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
throw;
}
}