我有一个文件,其中包含一定数量的固定长度行。我需要读取每一行以获取该数字并处理它们并写入文件。 由于我需要读取每一行,随着行数的增加,它变得非常耗时。
是否有一种有效的方法来读取文件的每一行?我正在使用C#。
答案 0 :(得分:14)
File.ReadLines
(.NET 4.0+)可能是最有效的内存方式。
它返回一个IEnumerable<string>
,意味着这些行将以流式方式延迟读取。
以前的版本没有以这种方式提供的流媒体选项,但使用StreamReader
逐行阅读也会达到相同的效果。
答案 1 :(得分:0)
从文件中读取所有行始终至少为O(n)。当文件大小开始成为问题时,可能是查看为信息而不是平面文件创建数据库的好时机。
答案 2 :(得分:0)
不确定这是最有效的,但对我来说效果很好: 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);
}
}
答案 3 :(得分:0)
无论您使用哪种操作系统,代码与实际存储机制之间都会有多层。硬盘驱动器和磁带驱动器以块为单位存储文件,目前这些文件通常大约为4K。如果你想读取一个字节,设备仍然会将整个块读入内存 - 这种方式更快。设备和OS也可以各自保持块的缓存。因此,您无法更改标准(高度优化)的文件读取行为;只需在需要时阅读文件,让系统负责其余部分。
如果处理文件的时间成为问题,可能有用的两个选项是:
尝试安排使用较短的文件。听起来你正在处理日志文件或其他东西 - 更频繁地运行你的程序可能有助于至少给出更好性能的外观。
更改数据的存储方式。同样,我理解该文件来自某些外部源,但也许您可以安排运行的作业,定期将原始文件转换为您可以更快速读取的内容。