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