2015-06-08 74 views
4

我有一个非常长的文本文件。所有行都具有相同的长度。我想在C#中读取第一百万行,而不先读取先前的999999行,否则程序变得太慢。我能怎么做?在C#中读取第一百万行

回答

4

你知道每行有字节吗?

NB了解字符数量是不够的。

如果你知道这是个字节固定数量的使用:

using(Stream stream = File.Open(fileName, FileMode.Open)) 
{ 
    stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin); 
    using(StreamReader reader = new StreamReader(stream)) 
    { 
     string line = reader.ReadLine(); 
    } 
} 

如果没有,那么:

string line = File.ReadLines(FileName).Skip(999999).Take(1).First(); 

虽然这第二个选项仍然需要被列举的线条,它避免了阅读整个文件一次全部存入内存中以便这样做。

+8

请提供说明该代码如何解决“没有先读取先前的999999”? –

+1

这是一个可怕的答案。您的示例将所有行读入内存,然后跳过内存中的999,999个项目,以便它可以取1个项目。你做一个“Take”,然后是“First”。如果你正在做'First',那么省略Take(1)'片。无论哪种方式,你的答案都与OP所要求的完全相反。 –

+0

@JohnathonSullinger谢谢您的评论,请参阅我的更新 – Tom

14

试试这个

const int BYTES_PER_LINE = 120; 
static void Main(string[] args) 
{ 
    StreamReader reader = new StreamReader("FileName", Encoding.UTF8); 
    long skipLines = 999999; 

    reader.BaseStream.Position = skipLines * BYTES_PER_LINE; 
}​ 
+0

确保包含每行可能返回的0x0D和/或0x0A。通常我使用较大的数字前设置1跳跃行和测试。 – jdweng

1
streamReader.BaseStream.Seek(skip_lines_offset, SeekOrigin.Begin); 

string line = streamReader.ReadLine(); 

Seek方法避免读取整个文件。您可以阅读更多hereskip_lines_offset是行的字节偏移量,所以number_of_skipped_lines * bytes_In_Line

+1

通常情况下,如果答案包含对代码打算做什么的解释,以及为什么解决问题而不介绍其他问题,答案会更有帮助。 (这篇文章被至少一个用户标记,大概是因为他们认为没有解释的答案应该被删除。) –