繁体   English   中英

Node.js Readline 不写入输出文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM