【发布时间】:2021-07-01 13:23:05
【问题描述】:
https://nodejs.org/api/readline.html
为逐行读取 CSV 等大文件提供此解决方案:
const { createReadStream } = require('fs');
const { createInterface } = require('readline');
(async function processLineByLine() {
try {
const rl = createInterface({
input: createReadStream('big-file.txt'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
// Process the line.
});
await once(rl, 'close');
console.log('File processed.');
} catch (err) {
console.error(err);
}
})();
但我不想从头到尾读取整个文件,而是从第 1 行到第 10000、20000 到 30000 等的部分内容。
基本上,我希望能够为我的函数的给定运行设置“开始”和“结束”行。
这对readline 和fs.createReadStream 可行吗?
如果不是,请建议替代方法。
PS:这是一个大文件(大约 1 GB),将其加载到内存中会导致内存问题。
【问题讨论】:
-
线条的大小都一样吗?
-
除非您的行是固定的、相同的长度,否则如果不从文件开头读取并计算行数,直到您到达第 10,000 行,就无法知道第 10,000 行从哪里开始。这就是具有可变长度行的文本文件的工作方式。没有办法绕过它,除非您将文件预处理为更有效的格式(如数据库)或创建行位置索引。
-
嗯,大文件的内存问题可以通过使用流来解决,在任何给定时间,无论整个文件有多大,内存中都只有一小部分文件。
-
@lawrence 我想跳过迭代。
标签: node.js fs large-files node-streams large-file-support