从数据表生成.txt文件

本文关键字:txt 文件 数据表 | 更新日期: 2023-09-27 18:27:24

我正在根据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行的部分完成,但它从未完成。

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

有什么想法吗?

从数据表生成.txt文件

简短回答

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


长答案

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

(1) 想象一下:

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

(2) 它的实际工作原理:

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

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

因此,(1)需要向文件写入10000次,而(2)只需要写入(1)所需的一小部分(可能是5.000次,2.000次——这取决于缓冲区的实现方式)。

通过将Stream封装在using块中,或对其调用Flush(),无论何时处理完Stream,它都会将缓冲区(以及丢失的数据)刷新到文件中。

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

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

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

问题的信息