44

から までの大きなテキスト ファイルがあり30MBます10GB。を使用してファイル内の行数をカウントするにはどうすればよいNode.jsですか?

これらの制限があります。

  • ファイル全体をメモリに書き込む必要はありません
  • タスクを実行するために子プロセスは必要ありません
4

9 に答える 9

41

wcを使用しないソリューション:

var i;
var count = 0;
require('fs').createReadStream(process.argv[2])
  .on('data', function(chunk) {
    for (i=0; i < chunk.length; ++i)
      if (chunk[i] == 10) count++;
  })
  .on('end', function() {
    console.log(count);
  });

遅くなりますが、期待するほどではありません-node.jsの読み込みと起動時間を含む140M以上のファイルで0.6秒

>time node countlines.js video.mp4 
619643

real    0m0.614s
user    0m0.489s
sys 0m0.132s

>time wc -l video.mp4 
619643 video.mp4
real    0m0.133s
user    0m0.108s
sys 0m0.024s

>wc -c video.mp4
144681406  video.mp4
于 2012-09-17T05:16:46.180 に答える
30

コメントが使用を示唆しているように、これを行うことができますwc

var exec = require('child_process').exec;

exec('wc /path/to/file', function (error, results) {
    console.log(results);
});
于 2012-09-17T04:29:27.853 に答える
4

Node 8 以降を使用している場合は、この async/await パターンを使用できます

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function fileLineCount({ fileLocation }) {
  const { stdout } = await exec(`cat ${fileLocation} | wc -l`);
  return parseInt(stdout);
};

// Usage

async someFunction() {
  const lineCount = await fileLineCount({ fileLocation: 'some/file.json' });
}
于 2019-02-28T02:04:43.490 に答える
3

入れ子をあまり使わない別の方法を次に示します。

var fs = require('fs');
filePath = process.argv[2];
fileBuffer =  fs.readFileSync(filePath);
to_string = fileBuffer.toString();
split_lines = to_string.split("\n");
console.log(split_lines.length-1);
于 2015-08-29T13:57:31.077 に答える
1

indexOf() も使用できます。

var index = -1;
var count = 0;
while ((index = chunk.indexOf(10, index + 1)) > -1) count++;
于 2015-11-25T19:22:17.497 に答える