1. ホーム
  2. javascript

[解決済み】node.js:テキストファイルを配列に読み込む。(各行は配列のアイテムです)。

2022-04-15 17:01:02

質問

node.jsで、とてもとても大きなファイルをJavaScriptの配列に読み込みたいのですが、どうすればいいですか?

で、こんな感じのファイルなら

first line
two 
three
...
...

配列を持つことになる。

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

関数は次のようになる。

var array = load(filename); 

したがって、すべて文字列として読み込んでから分割するという発想は通用しない。

どのように解決するのですか?

最終的なデータを配列に収めることができるのであれば、提案されているように、文字列に収めて分割することもできるのではないでしょうか? いずれにせよ、ファイルを一行ずつ処理したいのであれば、次のような方法もあります。

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);

EDITです。 (のコメントに対して フォプキンス (v8のソースコードをざっと見たところでは、少なくとも新しいバージョンでは) substringはデータをコピーするのではなく、特別なSlicedStringオブジェクトを作成するのだと思うのですが。いずれにせよ、ここに、前述のsubstringを回避するための修正を示します(数メガバイト分の "All work and no play makes Jack a dull boy" のファイルでテストしました)。

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);
    }
  });
}