1

我正在根据收集的数据动态创建一个文本文件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 行的部分完成,但它永远不会完成。

我没有在任何时候干扰或停止过申请。

有任何想法吗?

4

2 回答 2

2

简短的回答

您需要Stream通过将 包装StreamWriter在一个using块中或在循环sw.Flush()结束时调用来刷新 , 。foreach


长答案

当使用StreamWriter任何类型的(StreamWriter, BinaryWriter, TextWriter)时,写入底层流/设备(在您的情况下是文件) - 它不会直接写入文件,因为与使用缓冲区相比,这很昂贵。

(1) 想象一下:

  • 您正在循环浏览 10.000 条记录
  • 每条记录在调用时直接写入文件.Write(),然后再继续下一条记录。

(2) 它是如何工作的:

  • 您正在循环浏览 10.000 条记录
  • 调用 时,每条记录都会写入缓冲区.Write(),然后再继续下一条记录。
  • 当缓冲区达到一定大小/元素数量时,它将刷新到磁盘。

您可以看到,与(1)相比,使用(2)您将获得很多 IO 性能,因为不需要立即将每条新记录写入文件。

So (1) would need to write to the file 10.000 times, while (2) only has to write a fraction of what (1) needs to (which could be 5.000 times, 2.000 times - it depends on how the buffer is implemented).

By wrapping the Stream in a using block, or calling Flush() on it, whenever you're done with the Stream will make it flush the buffer (and missing data) to the file.

于 2013-08-13T10:44:25.973 回答
0

我不能确定是什么原因造成的,但我可以看到您(和我们)需要更多信息。

Product.Rows让我们首先通过放置断点并在手表中查看count属性来了解其中有多少行。

之后,如果行数与您的相同,请在循环上放置一个计数器并检查它是否以相同的次数通过循环。最后,尝试找到写入文件的最后一行,并在循环中逐步调试该行。您可能会遇到异常(不太可能,但有可能),并且您可能会发现有关该问题的更多信息

于 2013-08-13T10:30:17.923 回答