从数据表生成.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行的部分完成,但它从未完成。
我在任何时候都没有干扰或停止应用程序。
有什么想法吗?
简短回答
您需要通过将StreamWriter
封装在using
块中或在foreach
循环结束时调用sw.Flush()
来刷新Stream
。
长答案
当使用任何类型的StreamWriter
(StreamWriter
、BinaryWriter
、TextWriter
),写入底层流/设备(在您的情况下是文件)时,它不会直接写入文件,因为与使用缓冲区相比,这是昂贵的。
(1) 想象一下:
- 您正在循环浏览10000条记录
- 在调用
.Write()
时,每个记录都会直接写入文件,然后再继续下一个记录
(2) 它的实际工作原理:
- 您正在循环浏览10000条记录
- 在调用
.Write()
时,每个记录都被写入缓冲区,然后再转到下一个记录 - 当缓冲区达到一定大小/元素数量时,它将刷新到光盘
您可以看到,与(1)相比,使用(2)可以获得很大的IO性能,因为不需要立即将每个新记录写入文件。
因此,(1)需要向文件写入10000次,而(2)只需要写入(1)所需的一小部分(可能是5.000次,2.000次——这取决于缓冲区的实现方式)。
通过将Stream
封装在using
块中,或对其调用Flush()
,无论何时处理完Stream
,它都会将缓冲区(以及丢失的数据)刷新到文件中。
我不能确定是什么原因导致的,但我可以看出您(和我们)需要更多信息。
让我们通过放置断点来了解Product.Rows
中有多少行,并在手表中查看count
属性。
之后,如果行数与您想象的相同,则在循环中放置一个计数器,并检查它是否通过循环的次数相同。最后,尝试找到写入文件的最后一行,并在循环中逐步调试该行。您可能会遇到异常(不太可能,但有可能),并且您可能会发现更多关于