4 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超13個贊
為什么不是一個簡單的轉(zhuǎn)換流和? 可以將回調(diào)作為第二個參數(shù),即 如果您需要替換單詞而不是完全刪除它們。replace()replace.replace(/bad1|bad2|bad3/g, filterWords)
const fs = require("fs")
const { pipeline, Transform } = require("stream")
const { join } = require("path")
const readFile = fs.createReadStream("./words.txt")
const writeFile = fs.createWriteStream(
join(__dirname, "words-filtered.txt"),
"utf8"
)
const transformFile = new Transform({
transform(chunk, enc, next) {
let c = chunk.toString().replace(/bad/g, "replaced")
this.push(c)
next()
},
})
pipeline(readFile, transformFile, writeFile, (err) => {
if (err) {
console.log(err.message)
}
})

TA貢獻(xiàn)1887條經(jīng)驗 獲得超5個贊
https://nodejs.org/api/fs.html#fs_fs_read_fd_buffer_offset_length_position_callback
不要一次讀取整個文件...閱讀其中的一小段緩沖。并用緩沖的片段尋找您的輸入....然后增加您的緩沖區(qū)起始位置并再次執(zhí)行此操作....建議讓每個緩沖區(qū)開始,而不是在前一個緩沖區(qū)的末尾...但至少與所搜索數(shù)據(jù)的預(yù)期大小重疊,這樣您就不會遇到一半數(shù)據(jù)位于一個緩沖區(qū)的末尾,而另一半位于另一個緩沖區(qū)的開頭

TA貢獻(xiàn)1876條經(jīng)驗 獲得超5個贊
您可能想要做的是使用流,以便在部分讀取后寫入。此示例可能適合您。您需要將輸出文本文件“.tmp”復(fù)制到原始文件上,以便在問題中獲得相同的行為。它的工作原理是閱讀一個塊,然后查看你是否遇到了一條新線。然后它處理該行,寫入它,然后將其從緩沖區(qū)中刪除。這應(yīng)該有助于解決您的記憶問題。
var fs = require("fs");
var readStream = fs.createReadStream("./BFFile.txt", { encoding: "utf-8" });
var writeStream = fs.createWriteStream("./BFFile.txt.tmp");
const STRING_TO_REMOVE = "badword";
var buffer = ""
readStream.on("data", (chunk) => {
buffer += chunk;
var indexOfNewLine = buffer.search("\n");
while (indexOfNewLine !== -1) {
var line = buffer.substring(0, indexOfNewLine + 1);
buffer = buffer.substring(indexOfNewLine + 1, buffer.length);
line = line.replace(new RegExp(STRING_TO_REMOVE), "");
writeStream.write(line);
indexOfNewLine = buffer.search("\n");
}
})
readStream.on("end", () => {
buffer = buffer.replace(new RegExp(STRING_TO_REMOVE), "");
writeStream.write(buffer);
writeStream.close();
})
此解決方案有一些假設(shè),例如數(shù)據(jù)是UTF-8,每行可能只有1個壞詞,每行都有一些文本(我沒有測試),并且每行都以新行結(jié)尾而不是其他行結(jié)尾。
以下是 Node 中流的文檔,我的另一個想法是使用管道和轉(zhuǎn)換流,但這似乎是過度殺戮。
添加回答
舉報