逐块读取文本文件
本文关键字:文件 取文本 读取 | 更新日期: 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。