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 みたいなのがあればいいのに。

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

Web で見つけてきた JavaScript の動作検証をしようと、ファイルからデータ(1行に1データ)を読み込んで処理する方法を探したら見つかったのでメモ。

 cf. Node.jsでテキストを1行ずつ処理する – console.lealog();

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

var inputStream = fs.createReadStream('./input.txt');
var inputReadLine = rl.createInterface({'input': inputStream, 'output': {}});

inputReadLine
  .on('line', function(line){
    console.log(line * 10.0);
  })
  .on('close', function() {
  });
takatoh@nightschool $ cat input.txt
1
2
3
4
5
6
7
8
9
10
takatoh@nightschool $ nodejs readline.js
10
20
30
40
50
60
70
80
90
100