Node.jsでファイルを2行ずつ処理する

昨日、1行ずつ処理する方法はわかったけど、複数行、例えば2行ずつ処理したいこともある。ググってみたら Qiita で見つけた。

 cf. ストリームを行ごとに処理~readline編~ – Qiita

真似して書いてみた。

var readline = require('readline');
var fs = require('fs');

function LineReader(stream) {
  var self = this;
  self.rl = readline.createInterface({
    "input": stream,
    "output": {}
  });
  self.list = [];
}

LineReader.prototype.forEach = function(unit, fn, callback) {
  var self = this;

  self.rl.on("line", function(line) {
    self.list.push(line);
    if (self.list.length == unit) {
      fn(self.list);
      self.list = [];
    }
  });

  self.rl.on("close", function(line) {
    if (self.list.length) {
      fn(self.list);
    }
    callback();
  });
}

var infile = process.argv[2];
var rs = fs.createReadStream(infile);
var linereader = new LineReader(rs);

linereader.forEach(2, function(list) {
  console.log(list.join(":"));
}, function() {
});
takatoh@nightschool $ cat input.txt
3
1 2 3
4
2 4 8 16
4
2 3 5 7
takatoh@nightschool $ nodejs readline_unit.js input.txt
3:1 2 3
4:2 4 8 16
4:2 3 5 7

上の実行例では2行ずつだけど、forEach の第1引数でほかの値を指定すれば任意行ずつ処理ができる。
ただ、指定した行(とその端数)ずつしか処理できないんだよな。何行ずつ処理するかを動的には決められない。Ruby の gets みたいなのがあればいいのに。