在C#中读取第一百万行

本文关键字:第一百万 读取 | 更新日期: 2023-09-27 17:54:28

我有一个很长的文本文件。所有行的长度都相同。我想在C#中读取第一百万行,而不首先读取之前的999999行,因为否则程序会变得太慢。我该怎么办?

在C#中读取第一百万行

试试这个

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;
}​

您知道每行中字节数吗?

注意知道字符数是不够的。

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

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();

虽然第二个选项仍然需要枚举行,但它避免了一次将整个文件读入内存

当然,如果你说的第一百万行是指文件的末尾,那么另一种方法是有意义的。找到文件的大小,然后用它来读取末尾的行数。

streamReader.BaseStream.Seek(skip_lines_offset, SeekOrigin.Begin);
string line = streamReader.ReadLine();

Seek方法避免读取整个文件。你可以在这里阅读更多。skip_lines_offset是行的字节偏移量,因此number_of_skipped_lines * bytes_In_Line