Node.js Readline не пишет в выходной файл - PullRequest
0 голосов
/ 22 мая 2018

Фон

Я пытаюсь построчно прочитать файл размером в несколько ГБ.Я хочу обработать каждую строку и после этого записать ее в файл.Я не хочу (и не могу) поместить все в память.

Важно, чтобы порядок, в котором я читаю строку, был порядком, в котором я записывал ее в файл.

Код

Чтобы добиться этого, я попытался использовать 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.

Проблема в том, что выходной файл всегда пуст.Ничто никогда не написано в это.

Я прочитал все методы, события и опции, но явно что-то упустил.

Вопрос

Почему этот код не записывается в файл?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Ответ

С текущим кодом, я фактически кормлю Readline с transformedLine снова.

Это не то, что я хочу.То, что я должен сделать, это написать прямо в 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 );
});

. В результате получится выходной файл, соответствующий порядку ввода.

Для более подробного обсуждения механики потока и внутренних буферов см .:

0 голосов
/ 22 мая 2018

Можете ли вы попробовать это

const fs = require( "fs" ),
readline = require( "readline" );

const readStream = fs.createReadStream("./logs/report.csv");
const writeStream = fs.createWriteStream("./logs/report.csv");

readStream.pipe(writeStream);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...