我必须阅读一个非常大的csv文件(> 80MB并且不断增长).
我通常只需要解析文件的最后1%.但是到达那个部分需要几分钟.
有没有办法我才开始在N行读书?
或者我可以从头到尾读取流吗?
我目前正在使用fast-csv来读取文件:
// convert csv into postgres copy file
csv.fromPath(filepath, {
headers: false
}).transform(function(data) {
// check if record meets condition
var dt = parseInt(data[0]);
var date = new Date(dt * 1000);
var mom = moment(date);
if (mom.isAfter('2014-01-01 00:00')) {
// transform data and return object
return transform(data);
}
return null;
}).pipe(csv.createWriteStream({
headers: true
})).pipe(fs.createWriteStream(outpath, {
encoding: "utf8"
})).on('finish', function() {
// do postgres import
});
最佳答案 使用节点
fs.stat
,
fs.open
,
fs.read
的组合,您可以找到文件的大小,只需将最后1%读入缓冲区:
var fs = require('fs');
var filename = 'csv.csv';
fs.stat(filename, function(err, stat) {
if(err) throw err;
var bytesToRead = Math.ceil(0.01 * stat.size); // last 1%
var startingPosition = stat.size - bytesToRead;
var readBuffer = new Buffer(bytesToRead);
fs.open(filename, 'r', function(err, fd){
if(err) throw err;
fs.read(fd, readBuffer, 0, bytesToRead, startingPosition,
function(err, bytesRead){
if(err) throw err;
console.log(readBuffer.toString());
});
});
});
您无法从N行开始阅读,因为您必须全部阅读以了解换行符的位置.