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