我有一个很长的文本文件。所有行都具有相同的长度。我想在C#中读取百万行而没有先读取之前的999999行,否则程序会变得太慢。我该怎么办?
答案 0 :(得分:17)
试试这个
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;
}
答案 1 :(得分:5)
你知道每行中字节的数量吗?
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();
虽然第二个选项仍然需要枚举行,但它可以避免一次性将整个文件读入内存中。
答案 2 :(得分:1)
streamReader.BaseStream.Seek(skip_lines_offset, SeekOrigin.Begin);
string line = streamReader.ReadLine();
Seek
方法避免读取整个文件。您可以阅读更多here。 skip_lines_offset
是该行的字节偏移量,因此number_of_skipped_lines * bytes_In_Line