web-dev-qa-db-ja.com

Node JS)のファイルの最初の行だけを読み取る最も効率的な方法は何ですか?

長いテキストファイルがたくさんあり、各ファイルの最初の行からデータを抽出するだけでよいと想像してください(それ以上のコンテンツを読む必要はありません)。 Node JSでそれを行うための最良の方法は何ですか?

ありがとう!

10
Pensierinmusica

私はこのソリューションを採用することになりました。これは、これまでに見た中で最もパフォーマンスが高いようです。

_var fs = require('fs');
var Q = require('q');

function readFirstLine (path) {
  return Q.promise(function (resolve, reject) {
    var rs = fs.createReadStream(path, {encoding: 'utf8'});
    var acc = '';
    var pos = 0;
    var index;
    rs
      .on('data', function (chunk) {
        index = chunk.indexOf('\n');
        acc += chunk;
        index !== -1 ? rs.close() : pos += chunk.length;
      })
      .on('close', function () {
        resolve(acc.slice(0, pos + index));
      })
      .on('error', function (err) {
        reject(err);
      })
  });
}
_

便宜上、「 firstline "」という名前のnpmモジュールを作成しました。

String.prototype.slice()の使用を提案してくれた@dandavisに感謝します!

8
Pensierinmusica

これを試してください:

https://github.com/yinrong/node-line-stream-util#get-head-lines

ヘッドラインを取得したら、アップストリームのパイプを外します。

2
Jake

//どうぞ;

var lineReader = require('line-reader');
var async = require('async');

exports.readManyFiles = function(files) {
    async.map(files, 
        function(file, callback))
            lineReader.open(file, function(reader) {
              if (reader.hasNextLine()) {
                reader.nextLine(function(line) {
                  callback(null,line);
                });
              }
            });
        },
        function(err, allLines) {
            //do whatever you want to with the lines
        })
}
1
Safi