【问题标题】:Export to CSV out of memory导出到 CSV 内存不足
【发布时间】:2018-02-22 14:42:08
【问题描述】:

当我将数据表写入 csv 文件时,内存不足。 我用以下内容编写文件:

if (!filtered)
    {
        string TextExport = DataTableToCSV(datatable, TextSeparator);
        File.WriteAllText(FileName, TextExport);     // Write to the file name selected.                           
    }

private string DataTableToCSV(DataTable datatable, string seperator, bool SuppressDialog = false) 
        {
            try
            {
                StringBuilder sb = new StringBuilder();
                sb.Clear();
                sb.Append(@"""");  //start row with " 
                    for (int i = 0; i < datatable.Columns.Count; ++i)
                {
                    sb.Append(datatable.Columns[i].ToString());
                    if (i < datatable.Columns.Count - 1)
                        sb.Append(seperator);
                }
                sb.Append(@"""");   // end row with "
                sb.AppendLine();  //place the header

                foreach (DataRow dr in datatable.Rows)
                {
                    sb.Append(@""""); //  start row with "
                    for (int i = 0; i < datatable.Columns.Count; ++i)
                    {
                        sb.Append(dr[i].ToString());
                        if (i < datatable.Columns.Count - 1)
                            sb.Append(seperator);
                    }
                    sb.Append(@""""); // end row with "
                    sb.AppendLine();  //same as : sb.Append(Environment.NewLine);
                }
                if (SuppressDialog == false)
                {
                    MessageBox.Show("Opslaan bestand is gereed.",
                            "Informatie",
                            MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                }
                return sb.ToString();
            }
            catch (Exception ex)
            {
                Logging.WriteToLog("FOUT", "Exporteren naar CSV bestand is mislukt.");
                Logging.WriteToLog("FOUT", "Melding : ");
                Logging.WriteToLog("FOUT", ex.ToString());
                return "";
            }
        }

我读到的是内存不足,因为我一次写入文件。 怎么逐行写?

【问题讨论】:

  • 你的数据表有多大?
  • 不要滚动你自己的 CSV 写作库。请记住,此类常见任务已经通过比您自己编写的更好的库来解决。您的业​​务不属于“CSV 库”业务。使用预先存在的库,例如 CsvHelper。不要试图重新发明轮子。
  • 如何打开文件并将行直接添加到文件中?如果您使用 StringBuilder,您会将所有数据存储到堆中,这不适合更大的表。
  • 顺便说一下,不要明确比较truefalse

标签: c# export-to-csv


【解决方案1】:

虽然其他人喜欢为此使用库,但我通常使用字符串列表并遍历它以写出大块文本。警告 - 我只用大约 35 MB 的文本完成了这项工作,而且写出来仍然需要相当长的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2014-11-12
    • 1970-01-01
    • 2016-06-09
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多