0

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

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

4

4 回答 4

1

您需要StreamReader类。

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

于 2013-07-12T10:32:47.830 回答
1

不,不幸的是,您无法跳过计算行数。在原始级别的文件不能在行号的基础上工作。相反,它们以位置/偏移量为基础工作。根文件系统没有行的概念。这是更高级别组件添加的概念。

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

虽然如果每行存在相同数量的字节,那么您可以尝试以下操作。

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();
    }
}
于 2013-07-12T10:36:50.817 回答
1

我相信最好的方法是使用流阅读器,

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

但是,我相信这些对您来说是一本不错的读物:

这个向您展示了如何分隔要阅读的代码块。这个答案是最适合的,您可以设置条件来读取您已阅读的行数,并设置条件来检查行数是否 == 50000 左右然后做一些事情。

如你看到的

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

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

对于您的问题,我相信您想要做的事情让您有些困惑,似乎您想突出显示 50000 行,然后将其作为一个来阅读,这不是 streamreader 的工作方式,是的,逐行阅读会产生这个过程更长,但不幸的是,情况就是这样。

于 2013-07-12T10:37:56.233 回答
0

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

但是,您可以做的是,在读取前 50000 行时,请记住最后一行的结束位置。然后,您可以直接寻找该偏移量并从那里继续阅读。

在行长度固定的情况下,您可以执行以下操作:

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

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

于 2013-07-12T10:30:57.540 回答