【问题标题】:Generating a .txt File From a DataTable从数据表生成 .txt 文件
【发布时间】:2013-08-13 10:23:04
【问题描述】:

我正在根据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 行的部分完成,但它永远不会完成。

我没有在任何时候干扰或停止该应用程序。

有什么想法吗?

【问题讨论】:

  • 您是否尝试将StreamWriter 包装在using 块中? - 这会将缓冲区刷新到底层流。 - 或者在你的 foreach 循环之后尝试调用sw.Flush()。
  • @ebb 使用 sw.Flush() 可以解决问题,您能否将其放在答案中并解释原因,我很乐意接受。谢谢。
  • @Clev231 原因,请阅读:stackoverflow.com/questions/2417978/…

标签: c# winforms


【解决方案1】:

简答

您需要刷新Stream,方法是将StreamWriter 包装在using 块中,或在foreach 循环结束时调用sw.Flush()。


长答案

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

(1) 想象一下:

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

(2) 它是如何工作的:

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

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

因此 (1) 需要写入文件 10.000 次,而 (2) 只需写入 (1) 所需内容的一小部分(可能是 5.000 次、2.000 次 - 这取决于缓冲区的方式已实施)。

通过将Stream 包装在using 块中,或在其上调用Flush(),每当您完成Stream 时,它都会将缓冲区(和丢失的数据)刷新到文件中。

【讨论】:

    【解决方案2】:

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

    让我们首先通过设置断点了解Product.Rows 中有多少行,然后在手表中查看count 属性。

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

    【讨论】:

    • 感谢您的回答,但我应该说我已经知道该表包含 773 行,文本文件有时甚至显示到第 773 行。 sw.Flush() 解决了我的问题。
    • @Clev231 你的意思是说你从来没有关闭过文件……在处理文件和流时你应该总是使用“using”语句
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 2016-05-21
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多