从DataTable生成.txt文件

时间:2013-08-13 10:23:04

标签: c# winforms

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

我没有随时干涉或停止申请。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

简短回答

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


答案很长

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

(1)想象一下:

  • 您正在循环播放10.000条记录
  • 在继续下一条记录之前,每个记录在调用.Write()时都会直接写入文件。

(2)它是如何运作的:

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

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

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

Stream封装在using块中,或在其上调用Flush(),只要您完成Stream,就会使其刷新缓冲区(和缺少数据)到文件。

答案 1 :(得分:0)

我不能肯定地说是什么原因,但我可以看到你(和我们)需要更多的信息。

让我们首先了解Product.Rows中有多少行,方法是设置一个断点并查看count属性。

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