我有一个很大的文本文件,范围在30MB和10GB之间。如何使用Node.js计算文件中的行数
我有以下限制:
发布于 2012-09-17 13:16:46
不使用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-17 12:29:28
您可以按照注释中的建议使用wc来完成此操作
var exec = require('child_process').exec;
exec('wc /path/to/file', function (error, results) {
console.log(results);
});发布于 2017-01-03 17:10:03
我们可以使用indexOf让VM找到换行符:
function countFileLines(filePath){
return new Promise((resolve, reject) => {
let lineCount = 0;
fs.createReadStream(filePath)
.on("data", (buffer) => {
let idx = -1;
lineCount--; // Because the loop will run once for idx=-1
do {
idx = buffer.indexOf(10, idx+1);
lineCount++;
} while (idx !== -1);
}).on("end", () => {
resolve(lineCount);
}).on("error", reject);
});
};这个解决方案的作用是使用.indexOf查找第一个换行符的位置。它递增lineCount,然后找到下一个位置。.indexOf的第二个参数告诉我们从哪里开始查找换行符。这样我们就跳过了大块的缓冲区。while循环将为每个换行符运行一次,加一次。
我们让Node运行时为我们做搜索,这是在较低的级别实现的,应该会更快。
在我的系统上,这大约是在一个大文件(111MB)上运行一个缓冲区长度的for循环的两倍。
https://stackoverflow.com/questions/12453057
复制相似问题