逐块读取文本文件

本文关键字:文件 取文本 读取 | 更新日期: 2023-09-27 18:22:02

我有一个包含200000行的文本文件。我想读取前50000行,然后处理它,然后读取第二部分,比如50001到100000等。当我读取第二个块时,我不会在第一个1到50000上写循环。我希望读卡器指针直接指向第50001行并开始读取。

这怎么可能?哪个阅读器用于此?

逐块读取文本文件

您需要StreamReader类。

有了这个,你可以用ReadLine()方法逐行阅读。你需要自己跟踪行数,并每50000行调用一个方法来处理你的数据,但只要你保持阅读器打开,你就不需要重新开始阅读。

不,不幸的是,您无法跳过对行的计数。在原始级别,文件不以行号为基础工作。相反,他们以仓位/抵销为基础工作。根文件系统没有行的概念。这是一个由更高级别组件添加的概念。

所以没有办法告诉操作系统,请打开指定行的文件。相反,你必须打开文件,跳过计算新行,直到你通过了指定的数字。然后将下一组字节存储到一个数组中,直到到达下一个新行。

不过,如果每一行的字节数相等,那么您可以尝试以下操作。

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

我认为最好的方法是使用流读取器

这里有两个与你相关的问题,你可以从中得到答案。但最终,如果你想获得文本块,除非是固定的数量,否则很难做到。

然而,我相信这些对你来说是一个很好的读物:

  • 正在读取文本文件的块

这篇文章向您展示了如何分离要读取的代码块。这个答案最适合,你可以设置条件来读取你读过的行数,并设置条件来检查行数是否为50000左右,然后做点什么。

如您所见

这个答案使用了关键字continue,我相信这将对你打算做的事情有用

  • 逐块读取文本文件

这一个向你展示了一个更可读的答案,但并没有真正回答你在阅读块中寻找的内容。

对于你的问题,我相信你想做的事情让你有点困惑,你似乎想突出显示50000行,然后将其作为一行来阅读,这不是streamreader的工作方式,是的,逐行阅读会使过程更长,但不幸的是,事实确实如此。

除非行的长度完全相同,否则不能直接从第50001行开始。

然而,您可以做的是,在读取前50000行时,记住最后一行的结尾。然后,您可以直接查找该偏移量并从那里继续读取。

如果行长度是固定的,你可以这样做:

myfile.Seek(50000 * (rowCharacters + 2), SeekOrigin.Begin);

Seek的偏移量为字节,所以您只需要告诉它50000行占用了多少字节。给定ASCII编码,这是行中的字符数,加上换行序列的2。