导出数据表为CSV时内存溢出问题



我使用下面的代码将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;
        }
    }

最新更新