1. ホーム
  2. javascript

[解決済み] node.jsでファイルを1行ずつ読み込む?

2022-03-15 15:28:14

質問

大きなファイルを一行ずつ読もうとしています。私は Quoraでの質問 しかし、全体がまとまるようにするには、いくつかの接続が不足しています。

 var Lazy=require("lazy");
 new Lazy(process.stdin)
     .lines
     .forEach(
          function(line) { 
              console.log(line.toString()); 
          }
 );
 process.stdin.resume();

私が解明したいのは、このサンプルのようにSTDINではなく、ファイルから一度に1行ずつ読み込む方法です。

試してみました。

 fs.open('./VeryBigFile.csv', 'r', '0666', Process);

 function Process(err, fd) {
    if (err) throw err;
    // DO lazy read 
 }

が、うまくいきません。 いざとなったらPHPのようなものを使えばいいのはわかっているのですが、これを解決したいのです。

ファイルは、私がそれを実行しているサーバーのメモリよりもはるかに大きいので、他の回答はうまくいかないと思います。

解決方法は?

Node.js v0.12以降、Node.js v4.0.0の時点では、安定版である リードライン コアモジュールです。ここでは、外部モジュールを使わずに、ファイルから行を読み取る最も簡単な方法を紹介します。

const fs = require('fs');
const readline = require('readline');

async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });
  // Note: we use the crlfDelay option to recognize all instances of CR LF
  // ('\r\n') in input.txt as a single line break.

  for await (const line of rl) {
    // Each line in input.txt will be successively available here as `line`.
    console.log(`Line from file: ${line}`);
  }
}

processLineByLine();

あるいは、その代わりに

var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('file.in')
});

lineReader.on('line', function (line) {
  console.log('Line from file:', line);
});

がなくても、最終行は正しく読み込まれます(Node v0.12 以降)。 \n .

アップデイト : この例は Node の API 公式ドキュメントに追加されました。 .