node.js изменить поток данных файла?

Мне нужно скопировать один большой файл данных в другое место с некоторыми изменениями. fs.readFile и fs.writeFile работают очень медленно. Мне нужно читать построчно, изменять и записывать в новый файл. Я нашел что-то вроде этого:

fs.stat(sourceFile, function(err, stat){
    var filesize = stat.size;

    var readStream = fs.createReadStream(sourceFile);

    // HERE I want do some modifications with bytes

    readStream.pipe(fs.createWriteStream(destFile));
})

Но как внести изменения? Я пытался получить данные с помощью события data

readStream.on('data', function(buffer){
    var str = strToBytes(buffer);
    str.replace('hello', '');
    // How to write ???
});

но не понимаю, как записать это в файл:


person Arti    schedule 19.08.2017    source источник
comment
through2 может вам помочь. Первый пример кода в значительной степени показывает, что именно вы хотите сделать.   -  person robertklep    schedule 19.08.2017


Ответы (1)


Вы должны использовать поток transform и использовать такие каналы:

fs.createReadStream('input/file.txt')
     .pipe(new YourTransformStream())
     .pipe(fs.createWriteStream('output/file.txt'))

Затем нужно просто реализовать поток преобразования, как в этом документе.

Вы также можете упростить себе задачу, используя scramjet, например:

fs.createReadStream('input/file.txt')
     .pipe(new StringStream('utf-8'))
     .split('\n')                                          // split every line
     .map(async (line) => await makeYourChangesTo(line))   // update the lines
     .join('\n')                                           // join again
     .pipe(fs.createWriteStream('output/file.txt'))

Что, я полагаю, проще, чем делать это вручную.

person Michał Karpacki    schedule 04.04.2018
comment
как сделать это синхронно, например, как узнать, когда это завершено, а затем вернуться к вызывающей функции? - person Dreams; 08.05.2020
comment
Ну не надо делать это синхронно и с потоками не суть. Вы можете использовать async/await, а затем просто вернуть обещание, которое разрешается onFinished. Если хотите, создайте новый вопрос по этому поводу и разместите его здесь - отвечу более подробно. :) - person Michał Karpacki; 12.05.2020