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