从Node.js中的文件同步读取行

And*_*cia 26 javascript node.js

我需要使用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
Run Code Online (Sandbox Code Playgroud)

它代表一个图表.前两行是边和顶点的数量,后面是边.

我可以通过以下方式完成任务:

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();
})
Run Code Online (Sandbox Code Playgroud)

我明白这样的事情可能不是什么Node.js的被认为对的,但级联ifline回调并没有真正看起来优雅/读给我.

有没有办法像其他编程语言一样从流中读取同步行?

如果没有内置解决方案,我愿意使用插件.

[编辑]

对不起,我应该更清楚一点,我想避免事先将整个文件加载到内存中

Ale*_*Ten 42

这些简单任务的常用代码部分:

var lines = require('fs').readFileSync(filename, 'utf-8')
    .split('\n')
    .filter(Boolean);
Run Code Online (Sandbox Code Playgroud)

lines 是一个没有空字符串的字符串数组.

  • 谢谢.但是,我仍然对不在内存中加载整个文件的精益解决方案感兴趣. (9认同)
  • 这种方式无法处理大文件,如10000000行日志文件,因为你可以用缓冲区加载大文件到内存,但是nodejs toString方法不能处理太大的缓冲对象. (7认同)
  • 如果您有十亿个 txt 日志文件,每个日志文件有几千行长,那么它的效果会非常好。其中每个 txt 文件都是一个测试执行日志,您希望解析所有相关数据并将该数据转储为 JSON 日志格式,以便使用 AWS ECS 集群将旧测试数据迁移到新的 Kabana 仪表板。;-) (2认同)
  • 不要忘记 MultiOS 的 `const {EOL} = require('os');` 而不是 '\n' (2认同)

And*_*cia 11

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(' '));
}
Run Code Online (Sandbox Code Playgroud)