【发布时间】:2012-03-02 02:13:00
【问题描述】:
我有一个文件,其中包含一定数量的具有一些数字的固定长度行。我需要读取每一行以获得该数字并处理它们并写入文件。 由于我需要读取每一行,随着行数的增加,它变得很耗时。
是否有读取文件每一行的有效方法?我正在使用 C#。
【问题讨论】:
-
你是4.0还是2/3.5?
标签: c# file-handling
我有一个文件,其中包含一定数量的具有一些数字的固定长度行。我需要读取每一行以获得该数字并处理它们并写入文件。 由于我需要读取每一行,随着行数的增加,它变得很耗时。
是否有读取文件每一行的有效方法?我正在使用 C#。
【问题讨论】:
标签: c# file-handling
File.ReadLines (.NET 4.0+) 可能是最节省内存的方法。
它返回一个IEnumerable<string>,这意味着行将以流的方式被懒惰地读取。
以前的版本没有这种方式的流式传输选项,但是使用StreamReader逐行读取可以达到相同的效果。
【讨论】:
从文件中读取所有行总是至少 O(n)。当文件大小开始成为问题时,可能是考虑为信息创建数据库而不是平面文件的好时机。
【讨论】:
不确定这是最有效的,但对我来说效果很好: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx
//Declare a new file and give it the path to your file
FileInfo fi1 = new FileInfo(path);
//Open the file and read the text
using (StreamReader sr = fi1.OpenText())
{
string s = "";
// Loop through each line
while ((s = sr.ReadLine()) != null)
{
//Here is where you handle your row in the file
Console.WriteLine(s);
}
}
【讨论】:
foreach(var line in File.ReadLines(path)) { Console.WriteLine(line); }。
无论您使用哪种操作系统,在您的代码和实际存储机制之间都会有好几层。硬盘驱动器和磁带驱动器以块的形式存储文件,如今每个块通常约为 4K。如果您想读取一个字节,设备仍会将整个块读取到内存中——这样会更快。设备和操作系统也可以各自保存一个块缓存。因此,您无法更改标准(高度优化的)文件读取行为;只需根据需要读取文件,其余的交给系统处理即可。
如果处理文件的时间成为问题,有两个选项可能会有所帮助:
尝试安排使用较短的文件。听起来您正在处理日志文件或其他东西 - 更频繁地运行程序可能有助于至少表现出更好的性能。
更改数据的存储方式。同样,我知道该文件来自某些外部来源,但也许您可以安排运行定期将原始文件转换为您可以更快阅读的文件的作业。
祝你好运。
【讨论】: