node.js:将文本文件读入数组。(每行数组中的一个项目。

2022-08-30 01:09:06

我想将一个非常非常大的文件读入node.js中的JavaScript数组中。

因此,如果文件如下所示:

first line
two 
three
...
...

我会有数组:

['first line','two','three', ... , ... ] 

该函数将如下所示:

var array = load(filename); 

因此,将其全部加载为字符串然后拆分的想法是不可接受的。


答案 1

同步:

var fs = require('fs');
var array = fs.readFileSync('file.txt').toString().split("\n");
for(i in array) {
    console.log(array[i]);
}

异步:

var fs = require('fs');
fs.readFile('file.txt', function(err, data) {
    if(err) throw err;
    var array = data.toString().split("\n");
    for(i in array) {
        console.log(array[i]);
    }
});

答案 2

如果您可以将最终数据放入数组中,那么您是否也可以将其放入字符串中并像建议的那样将其拆分?在任何情况下,如果您想一次处理一行文件,也可以尝试如下操作:

var fs = require('fs');

function readLines(input, func) {
  var remaining = '';

  input.on('data', function(data) {
    remaining += data;
    var index = remaining.indexOf('\n');
    while (index > -1) {
      var line = remaining.substring(0, index);
      remaining = remaining.substring(index + 1);
      func(line);
      index = remaining.indexOf('\n');
    }
  });

  input.on('end', function() {
    if (remaining.length > 0) {
      func(remaining);
    }
  });
}

function func(data) {
  console.log('Line: ' + data);
}

var input = fs.createReadStream('lines.txt');
readLines(input, func);

编辑:(回应phopkins的评论)我认为(至少在较新版本中)子字符串不会复制数据,而是创建一个特殊的SlicedString对象(从v8源代码的快速浏览中)。无论如何,这里有一个避免了上述子字符串的修改(在一个价值几兆字节的“所有工作和没有玩都使杰克成为一个沉闷的男孩”的文件中进行了测试):

function readLines(input, func) {
  var remaining = '';

  input.on('data', function(data) {
    remaining += data;
    var index = remaining.indexOf('\n');
    var last  = 0;
    while (index > -1) {
      var line = remaining.substring(last, index);
      last = index + 1;
      func(line);
      index = remaining.indexOf('\n', last);
    }

    remaining = remaining.substring(last);
  });

  input.on('end', function() {
    if (remaining.length > 0) {
      func(remaining);
    }
  });
}