我需要使用Node.js以下列格式逐行解析文件:
13 13 0 5 4 3 0 1 9 12 6 4 5 4 0 2 11 12 9 10 0 6 7 8 9 11 5 3
它代表一个图表.前两行是边和顶点的数量,后面是边.
我可以通过以下方式完成任务:
var fs = require('fs'); var readline = require('readline'); var read_stream = fs.createReadStream(filename); var rl = readline.createInterface({ input: read_stream }); var c = 0; var vertexes_number; var edges_number; var edges = []; rl.on('line', function(line){ if (c==0) { vertexes_number = parseInt(line); } else if (c==1) { edges_number = parseInt(line); } else { edges.push(line.split(' ')); } c++; }) .on('end', function(){ rl.close(); })
我明白这样的事情可能不是什么Node.js的被认为对的,但级联if
的line
回调并没有真正看起来优雅/读给我.
有没有办法像其他编程语言一样从流中读取同步行?
如果没有内置解决方案,我愿意使用插件.
[编辑]
对不起,我应该更清楚一点,我想避免事先将整个文件加载到内存中
这些简单任务的常用代码部分:
var lines = require('fs').readFileSync(filename, 'utf-8') .split('\n') .filter(Boolean);
lines
是一个没有空字符串的字符串数组.
github.com上的这个项目正是我所需要的:
https://github.com/nacholibre/node-readlines
var readlines = require('n-readlines'); var liner = new readlines(filename); var vertexes_number = parseInt(liner.next().toString('ascii')); var edges_number = parseInt(liner.next().toString('ascii')); var edges = []; var next; while (next = liner.next()) { edges.push(next.toString('ascii').split(' ')); }