示例:逐行读取文件流


\Example: Read file stream line-by-Line

node:readline 的一个常见用例是每次一行地消费输入文件。最简单的方式是利用 fs.ReadStream API 和 for await...of 循环:

\A common use case for node:readline is to consume an input file one line at a time. The easiest way to do so is leveraging the fs.ReadStream API as well as a for await...of loop:

const fs = require('node:fs');
const readline = require('node:readline');
async function processLineByLine() {
 const fileStream = fs.createReadStream('input.txt');
 const rl = readline.createInterface({
 input: fileStream,
 crlfDelay: Infinity
 });
 // Note: we use the crlfDelay option to recognize all instances of CR LF
 // ('\r\n') in input.txt as a single line break.
 for await (const line of rl) {
 // Each line in input.txt will be successively available here as `line`.
 console.log(`Line from file: ${line}`);
 }
}
processLineByLine(); 

或者,可以使用 'line' 事件:

\Alternatively, one could use the 'line' event:

const fs = require('node:fs');
const readline = require('node:readline');
const rl = readline.createInterface({
 input: fs.createReadStream('sample.txt'),
 crlfDelay: Infinity
});
rl.on('line', (line) => {
 console.log(`Line from file: ${line}`);
}); 

目前,for await...of 循环可能会慢一点。如果 async / await 流量和速度都必不可少,则可以应用混合方法:

\Currently, for await...of loop can be a bit slower. If async / await flow and speed are both essential, a mixed approach can be applied:

const { once } = require('node:events');
const { createReadStream } = require('node:fs');
const { createInterface } = require('node: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);
 }
})(); 

AltStyle によって変換されたページ (->オリジナル) /