18

シンプルな Node.js アプリを作成していますが、ファイルの最初の行を削除する必要があります。それを行う方法はありますか?fs.writeでできると思うのですが、どうですか?

4

3 に答える 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 に答える