尽管我找到了许多关于逐行读取文本文件或读取第N行的示例,但是我找不到关于如何从第N行读取到第M行的任何内容。
该文件有些大,大约5 GB(大约1000万行)。
编辑:行没有固定的长度。
您可以使用readline功能将文件读取为流,而无需将其整体加载到RAM中。这是一个如何完成的示例:
const fs = require('fs');
const readline = require('readline');
function readFromN2M(filename, n, m, func) {
const lineReader = readline.createInterface({
input: fs.createReadStream(filename),
});
let lineNumber = 0;
lineReader.on('line', function(line) {
lineNumber++;
if (lineNumber >= n && lineNumber < m) {
func(line, lineNumber);
}
});
}
让我们尝试一下:
// whatever you would like to do with those lines
const fnc = (line, number) => {
// e.g. print them to console like this:
console.log(`--- number: ${number}`);
console.log(line);
};
// read from this very file, lines from 4 to 7 (excluding 7):
readFromN2M(__filename, 4, 7, fnc);
这给出了输出:
// --- number: 4
// function readFromN2M(filename, n, m, func) {
// --- number: 5
// const lineReader = readline.createInterface({
// --- number: 6
// input: fs.createReadStream(filename),
行从1开始编号。要从0开始,只需稍微修改一下编号即可。
更新:
我刚刚意识到,从某种意义上说,如果某种文件没有以换行符结尾,那么这种方法并不是100%安全的,那么这种文件的最后一行将不会被这种方式读取。这是readline的设计方式...为了克服这一点,我将以更复杂的方式准备文件流-通过在需要时向这些流添加新的行字符。这将使解决方案更长一些。但这一切皆有可能。
更新2
正如您在评论中提到的那样,即使已经找到所需的行,lineReader仍会继续遍历,这会使应用程序变慢。我认为我们可以这样停止它:
lineReader.on('line', function(line) {
lineNumber++;
if (lineNumber >= n && lineNumber < m) {
func(line, lineNumber);
}
接下来的3行应立即停止lineReader,但不能立即停止,如官方文档所述
if (lineNumber > m) {
lineReader.close();
}
});
我相信这应该可以解决问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句