Javascript Node.js Readline未写入输出文件 背景
我试图逐行读取一个数GB大小的文件。我想处理每一行,然后将其写入一个文件。我不想(也不能)把一切都记在记忆里 重要的是,我读取一行的顺序是我将其写入文件的顺序 代码 为了实现这一点,我尝试使用Node.js 问题 如您所见,我正在尝试读取一行代码,对其进行解析,然后将其写入名为Javascript Node.js Readline未写入输出文件 背景,javascript,node.js,file,stream,Javascript,Node.js,File,Stream,我试图逐行读取一个数GB大小的文件。我想处理每一行,然后将其写入一个文件。我不想(也不能)把一切都记在记忆里 重要的是,我读取一行的顺序是我将其写入文件的顺序 代码 为了实现这一点,我尝试使用Node.js 问题 如您所见,我正在尝试读取一行代码,对其进行解析,然后将其写入名为out.csv的文件中 问题是输出文件总是空的。什么都没有写进去 我已经阅读了所有的方法、事件和选项,但显然我遗漏了一些东西 问题: 为什么这个代码没有写入文件?你能试试这个吗 const fs = require( "f
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 );
});
这将根据输入顺序生成一个输出文件
有关流机制和内部缓冲区的更详细讨论,请参阅:
读取时都写入
,并且写入速度低于读取速度,则仍会导致内存膨胀。虽然不如将整个文件读入内存
您应该将pipe
与stream.Transform
一起使用,而不是readline
。原因是管道在流中最慢的参与者阶段处理数据,所以不会占用内存
const stream=require('stream');
常数fs=要求('fs');
const readStream=fs.createReadStream(“./logs/report.csv”);
const writeStream=fs.createWriteStream(“./logs/report.csv”);
const transformer=new stream.Transform({
//buffer是流的一个块,enc是块的类型,done是转换完成时的回调
转换(缓冲区、enc、完成){
常量行=buffer.toString().split('\n');
const transformedChunkAsString=lines.map(workYourMagicAndReturnFormattedLine.join('\n');
const transformedBuffer=Buffer.from(transformedChunkAsString);
这个.push(transformedBuffer);
完成();
}
})
readStream.pipe(transformStream).pipe(writeStream);
将“terminal”设置为true将把该行写入文件writestream。它将在不进行任何转换的情况下写入该行,并且仅限于历史大小。这两件事我都不想要。这样做将创建我的文件的副本。这不是我想要的。如果我尝试转换数据,它也会异步地执行,而不保留任何顺序。只有这样,问题是块可能在中间行分裂,因此正则表达式可能不匹配您所寻找的。您可以将最后一行存储在transform函数外的变量中,如果没有完成,则将其前置到下一个块中
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 );
});