シンプルな Node.js アプリを作成していますが、ファイルの最初の行を削除する必要があります。それを行う方法はありますか?fs.writeでできると思うのですが、どうですか?
質問する
23713 次
3 に答える
2
@Lilleman のコメントのおかげで、元のソリューションに修正を加えました。これには、サードパーティのモジュール「行ごと」が必要であり、非常に大きなファイルの処理中にメモリ オーバーフローや競合状態を防ぐことができます。
const fs = require('fs');
const LineReader = require('line-by-line');
const removeLines = function(srcPath, destPath, count, cb) {
if(count <= 0) {
return cb();
}
var reader = new LineReader(srcPath);
var output = fs.createWriteStream(destPath);
var linesRemoved = 0;
var isFirstLine = true;
reader.on('line', (line) => {
if(linesRemoved < count) {
linesRemoved++;
return;
}
reader.pause();
var newLine;
if(isFirstLine) {
newLine = line;
isFirstLine = false;
} else {
newLine = '\n' + line;
}
output.write(newLine, () => {
reader.resume();
});
})
.on('error', (err) => {
reader.pause();
return cb(err);
})
.on('close', () => {
return cb();
})
}
---------------- 以下の元のソリューション ---------------
別の回答に触発された、改訂されたストリームバージョンを次に示します。
const fs = require('fs');
const readline = require('readline');
const removeFirstLine = function(srcPath, destPath, done) {
var rl = readline.createInterface({
input: fs.createReadStream(srcPath)
});
var output = fs.createWriteStream(destPath);
var firstRemoved = false;
rl.on('line', (line) => {
if(!firstRemoved) {
firstRemoved = true;
return;
}
output.write(line + '\n');
}).on('close', () => {
return done();
})
}
また、「firstRemoved」をカウンターに変更することで、特定の行数を削除するように簡単に変更できます。
var linesRemoved = 0;
...
if(linesRemoved < LINES_TO_BE_REMOVED) {
linesRemoved++;
return;
}
...
于 2017-03-18T19:25:54.543 に答える