我正在根据DataTable
收集的数据动态创建文本文件。
我当前的(测试)数据集有773行,我想用每个列的逗号(,)拆分,并在单独的行中断开每一行。这是我的尝试;
string FileName = "TEST_" + System.DateTime.Now.ToString("ddMMyyhhmm") + ".txt";
StreamWriter sw = File.CreateText(@"PATH...." + FileName);
foreach (DataRow row in Product.Rows)
{
bool firstCol = true;
foreach (DataColumn col in Product.Columns)
{
if (!firstCol) sw.Write(",");
sw.Write(row[col].ToString());
firstCol = false;
}
sw.WriteLine();
}
输出是一个文本文件,正如预期的那样。立即显示大部分数据,但文本文件从未完全显示773行。我已经尝试了好几次,行数可以从720行到750行一直到部分完成第773行,但它永远不会完成。
我没有随时干涉或停止申请。
有什么想法吗?
答案 0 :(得分:2)
简短回答
您需要清空Stream
,方法是将StreamWriter
封装在using
块中,或在sw.Flush()
循环结束时调用foreach
答案很长
使用任何类型的StreamWriter
(StreamWriter
,BinaryWriter
,TextWriter
)时,写入基础流/设备(在您的情况下为文件) - 它不会直接写入文件,因为与使用缓冲区相比,这是昂贵的。
(1)想象一下:
.Write()
时都会直接写入文件。(2)它是如何运作的:
.Write()
之前,每个记录都会写入缓冲区,然后再转到下一条记录。您可以看到,使用(2)与(1)相比,您将获得大量IO性能,因为每条新记录都不需要立即写入文件。
所以(1)需要写入文件10.000次,而(2)只需写入(1)需要的一小部分(可能是5.000次,2.000次 - 这取决于缓冲区的方式实施)。
将Stream
封装在using
块中,或在其上调用Flush()
,只要您完成Stream
,就会使其刷新缓冲区(和缺少数据)到文件。
答案 1 :(得分:0)
我不能肯定地说是什么原因,但我可以看到你(和我们)需要更多的信息。
让我们首先了解Product.Rows
中有多少行,方法是设置一个断点并查看count
属性。
之后,如果行数与您的行数相同,则在循环上放置一个计数器并检查它是否通过循环次数相同。最后,尝试找到写入文件的最后一行,并在循环中逐步调试该行。你可能会遇到异常(不太可能,但有可能),你可能会发现更多的问题