我有包含 200000 行的文本文件。我想读取前 50000 行,然后对其进行处理,然后读取第二部分,例如 50001 到 100000 等。当我读取第二个块时,我不会在第一个 1 到 50000 上写入循环。我希望读取器指针直接转到行号50001 并开始阅读。
怎么可能?哪个阅读器用于此目的?
我有包含 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。