2012-02-09 21 views
5

我有一个文件,其中包含一定数量的固定长度的行有一些数字。我需要读取每一行以获取该数字并处理它们并写入文件。 由于我需要读取每一行,随着行数的增加,它变得非常耗时。最有效的阅读文件的方式

是否有一种有效的方式来读取文件的每一行?我正在使用C#。

+4

属于在计算器上。 – 2012-02-09 14:53:34

+0

你在4.0或2/3.5? – 2012-02-09 15:31:57

回答

0

读取文件中的所有行始终至少为O(n)。当文件大小开始成为问题时,那么它可能是查看创建信息数据库而不是平面文件的好时机。

+0

井的文件,这将是在文件的形式的外部硬件,实际上大量文件的....有效地读出文件的任何方式的,将不胜感激 – Jay 2012-02-09 14:57:59

14

File.ReadLines(.NET 4.0+)可能是这样做的最有效的记忆方法。

它返回一个IEnumerable<string>,这意味着行会以流媒体的方式被懒惰地读取。

之前的版本没有以这种方式提供的流媒体选项,但使用StreamReader到逐行读取将达到相同的。

+1

这仅仅是在.NET 4或可用的结果更大。只是需要指出,不确定OP使用什么。 – 2012-02-09 15:30:58

+0

@AaronMcIver - 好点。答案已更新。 – Oded 2012-02-09 15:36:37

+0

我敢肯定,我用这3.5可能是File.ReadAllText它返回一个字符串数组 – Venki 2012-02-09 22:08:40

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); 
     } 
    } 
+0

在此之后我做什么,而不是只写一行到控制台,是转换行成一个数组并导入数据到数据库表。似乎通过制表符分隔的文件运行得非常快,但我几乎不用经过几千条记录。 – 2012-02-09 15:27:09

+0

除非你正在做一些特别的StreamReader,在这个例子中你不是,你可以直接写'foreach(var line in File.ReadLines(path)){Console.WriteLine(line); }'。 – Philip 2012-02-10 15:51:50

0

无论你使用的操作系统,会有你的代码和实际存储设备之间几层机制。硬盘驱动器和磁带驱动器以块形式存储文件,现在这些文件通常都在4K左右。如果你想读取一个字节,设备仍然可以将整个块读入内存 - 这只是更快。设备和操作系统也可以分别保留块的缓存。因此,您可以做些什么来改变标准(高度优化的)文件阅读行为;只需根据需要阅读文件,然后让系统处理其余部分。

如果处理文件的时间成为一个问题,有两个选项,可以帮助有:

  1. 尽量安排使用较短的文件。这听起来像你正在处理日志文件或更频繁地运行你的程序可能有助于至少提供更好的性能外观。

  2. 更改数据的存储方式。同样,我知道该文件来自某个外部来源,但也许您可以安排一份作业来定期将原始文件转换为可以更快读取的文件。

祝你好运。