nodejs -替换大文件中所有位置的字符串

but5z9lq  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(208)

我有一些很难在内存中读取的大文件。我需要读取每一行,然后替换双引号,如果找到并编辑同一个文件。现在,我正在逐行阅读文件,存储在数组中并覆盖同一个文件。但是,这给大文件带来了内存问题。有指针吗?下面是我目前的实现:

var allData = fs.readFileSync(fileName, { encoding: 'utf8' }).toString().split("\n");
var finalString = "";
for (i in allData) {

    allData[i] = allData[i].replace(/"/g, '""');
    finalString = finalString.concat(allData[i]);
    finalString = finalString.concat("\n");

}
fs.writeFileSync(fileName, finalString);

是否有一种方法可以通过一次阅读一行并在文件中更改它来进行编辑?
我在scramjet上看到过类似的问题,但这会给出一个错误,并且不兼容所有的nodejs版本:node.js modify file data stream?

sy5wg1nm

sy5wg1nm1#

在经历了很多答案后,这对我来说很有效,它处理了所需的同步和异步行为,大文件和保持名称相同。

function format_file(fileName) {
    return new Promise((resolve, reject) => {
        if (fs.existsSync(fileName)) {
            var fields = fileName.split('/');
            var tempFile = "";
            var arrayLength = fields.length;
            for (var i = 0; i < arrayLength - 1; i++) {
                tempFile = tempFile + fields[i] + "/";
                
            }
            tempFile = tempFile + "tempFile" + fields[arrayLength - 1];
            console.log("tempfile name is : " + tempFile + " actualFileName is :" + fileName);
            var processStream = new ProcessStream();
            fs.createReadStream(fileName, { bufferSize: 128 * 4096 })
                .pipe(processStream)
                .pipe(fs.createWriteStream(tempFile)).on('finish', function() { // finished
                    fs.renameSync(tempFile, fileName);
                    console.log('done encrypting');
                    resolve('done');
                });
        } else {
            reject('path not found')
        }
    });
}

相关问题