什么是最有效的方法来读取节点JS中的文件的第一行?
假设你有很多长文本文件,你只需要从每个文件的第一行提取数据(不需要读取更多的内容)。 什么是节点JS的最好的方法来做到这一点?
谢谢!
我最终采用了这个解决scheme,这看起来是迄今为止我见过的最高性能的解决scheme:
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); }) }); }
为了方便,我创build了一个名为“ firstline ”的npm模块。
感谢@dandavis的build议使用String.prototype.slice()
!
//干得好;
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 }) }