【发布时间】: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,您会将所有数据存储到堆中,这不适合更大的表。
-
顺便说一下,不要明确比较
true和false。
标签: c# export-to-csv