[英]Node.js Readline not writing to output file
我正在尝试逐行读取几个 GB 大小的文件。 我想处理每一行,然后将其写入文件。 我不想(也不能)将所有内容都放入内存中。
重要的是我读取一行的顺序是我将它写入文件的顺序。
为了实现这一点,我尝试使用 Node.js Readline 接口
const fs = require( "fs" ),
readline = require( "readline" );
const readStream = fs.createReadStream( "./logs/report.csv" );
const writeStream = fs.createWriteStream( "./logs/out.csv", { encoding: "utf8"} );
const rl = readline.createInterface({
input: readStream,
output: writeStream,
terminal: false,
historySize: 0
});
rl.on( "line", function(line) {
//Do your stuff ...
const transformedLine = line.toUpperCase();
console.log(transformedLine);
//Then write to outstream
rl.write(transformedLine );
});
如您所见,我正在尝试读取一行,解析它,并将其写入一个名为out.csv
的文件中。
问题是输出文件总是空的。 什么都没有写进去。
我已经阅读了所有的方法、事件和选项,但显然我遗漏了一些东西。
为什么这段代码没有写入文件?
你能试试这个吗
const fs = require( "fs" ),
readline = require( "readline" );
const readStream = fs.createReadStream("./logs/report.csv");
const writeStream = fs.createWriteStream("./logs/report.csv");
readStream.pipe(writeStream);
使用当前的代码,我实际上是再次使用transformedLine
Readline
提供数据。
这不是我想要的。 我应该做的是直接写入writeStream
。
rl.on( "line", function(line) {
console.log(line);
//Do your stuff ...
const transformedLine = line.toUpperCase();
console.log(transformedLine);
//Then write to outstream
writeStream.write( transformedLine );
});
这将产生一个尊重输入顺序的输出文件。
有关流机制和内部缓冲区的更详细讨论,请参阅:
我提出这个问题已经很晚了,但是对于阅读此内容的任何人:
如果你write
的每一个read
和写入的速度比读取速度慢的你还是会膨胀内存。 虽然不如将整个文件读入内存。
您应该使用带有stream.Transform
而不是readline
pipe
。 原因是管道在流程中最慢的参与者阶段处理数据,因此不会膨胀内存。
const stream = require('stream');
const fs = require('fs');
const readStream = fs.createReadStream("./logs/report.csv");
const writeStream = fs.createWriteStream("./logs/report.csv");
const transformer = new stream.Transform({
// buffer is a chunk of stream, enc is type of chunk, done is a callback when transform is done
transform(buffer, enc, done){
const lines = buffer.toString().split('\n');
const transformedChunkAsString = lines.map(workYourMagicAndReturnFormattedLine).join('\n');
const transformedBuffer = Buffer.from(transformedChunkAsString);
this.push(transformedBuffer);
done();
}
})
readStream.pipe(transformStream).pipe(writeStream);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.