NodeJS - fs.createReadStream () - как отрезать куски в определенный момент? - PullRequest
0 голосов
/ 18 июня 2020

У меня большой файл XML (2 ГБ), и мне нужно добавить новую строку, если критерий соблюден. Пример: от

<chickens>
    <chicken>
        <name>sam</name>
        <female>false</female>
    </chicken>
    <chicken>
        <name>julia</name>
        <female>true</female>
    </chicken>
    // many many more chickens
</chickens>

до:

<chickens>
    <chicken>
        <name>sam</name>
        <female>false</female>
    </chicken>
    <chicken>
        <name>julia</name>
        <female>true</female>
        <canLayEggs>true</canLayEggs> // <- Add this line if female is true;
    </chicken>
    // many many more chickens
</chickens>

Однако проблема, с которой я сталкиваюсь, заключается в том, что иногда фрагмент обрезается, как <female>true, а затем следующий фрагмент начинается с </female>

Вот мой код:

const fs = require("fs");
const input = "input.xml";

const MAX_CHUNK_SIZE = 50 * 1024 * 1024; //50 MB
const buffer = Buffer.alloc(MAX_CHUNK_SIZE);

let readStream = fs.createReadStream(input, "utf8", {
    highWaterMark: MAX_CHUNK_SIZE,
});
let writeStream = fs.createWriteStream("output.xml");

readStream.on("data", (chunk) => {
    let data = chunk;
    if (data.includes("<category>f</category>")) {
        data = data.replace(
            /<female>true<\/female>/g,
            "<female>true</female><canLayEggs>true</canLayEggs>"
        );
    }
    writeStream.write(data, "utf-8");
});

readStream.on("end", () => {
    writeStream.end();
})

Я пробовал Google, но не могу найти нужный термин, и многие учебники на самом деле не охватывают это . Любая помощь приветствуется.

1 Ответ

0 голосов
/ 21 августа 2020

вы читаете 50 МБ на блок. поэтому в обратном вызове для данных вы можете вызвать:

readStream.destroy();

также, вам не нужно инициализировать буфер размером 50 МБ, он не используется здесь и после текста замена, вероятно, больше, чем 50 МБ.

Хорошо, что вы закрываете writeStream, когда закрывается readStream.

...