首页 > 解决方案 > Node.js Readline 未写入输出文件

问题描述

背景

我正在尝试逐行读取几个 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.

问题是输出文件总是空的。没有任何东西被写入其中。

我已经阅读了所有的方法、事件和选项,但显然我遗漏了一些东西。

问题

为什么这段代码没有写入文件?

标签: javascriptnode.jsfilestream

解决方案


回答

使用当前代码,我实际上又在喂食ReadlinetransformedLine

这不是我想要的。我应该做的是直接写到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 );
});

这将产生一个符合输入顺序的输出文件。

有关流机制和内部缓冲区的更详细讨论,请参见:


推荐阅读