我需要上传大约350MB的csv,大约3,000,000行。我只需要检查第一行的标题。有没有一种有效的方法来做到这一点?使用node-csv需要很长时间,因为它解析了整个事情。我正在使用busyboy并有一个流。
答案 0 :(得分:1)
我从来没有解析过如此大的文件,但也许您可以尝试event-stream和get-line个软件包的组合:
var es, fs, getLine, getLines;
getLine = require('get-line');
fs = require('fs');
es = require('event-stream');
getLines = getLine({
lines: [1],
encoding: 'utf8'
});
console.time('get first line');
fs.createReadStream('./test.csv', { encoding: 'utf8' })
.pipe(getLines)
.pipe(es.map(function(line, next) {
var data = line.split(',').map(function(c) { return c.trim(); });
/* this will be called for each line, do your stuff here */
console.log(data);
return next(null, line);
})).pipe(es.wait(function(err, body) {
/* this is called after the processing of all lines, if you want to do something more */
/* can be removed if you don't need it */
console.timeEnd('get first line');
}));
编辑:刚刚使用来自here的胖csv(star2002
文件,2GB)尝试了我的代码,结果如下:
[ '1',
'1613423',
'807',
'20011015.2226039991',
'1613424',
'4518',
'0',
'0',
'654',
'1395',
'20011204.1149509996',
'10.955403',
'2288071',
'-0.28820264',
'0.40731233',
'10.559091' ]
get first line: 15ms
答案 1 :(得分:0)
使用node-csv软件包的方法可能会出现问题。 在示例中,他们有一个解析大型csv文件作为流的示例。 以下是示例from github:
var csv = require('..');
var i = 0
var generator = csv.generate({seed: 1, columns: 2, length: 20});
var parser = csv.parse();
var transformer = csv.transform(function(data){
i++
return data.map(function(value){return value.toUpperCase()});
});
var stringifier = csv.stringify();
generator.on('readable', function(){
while(data = generator.read()){
parser.write(data);
}
});
generator.on('end', function(){
parser.end()
});
parser.on('readable', function(){
while(data = parser.read()){
transformer.write(data);
}
});
parser.on('end', function(){
transformer.end()
});
transformer.on('readable', function(){
while(data = transformer.read()){
stringifier.write(data);
}
});
transformer.on('end', function(){
stringifier.end();
});
stringifier.on('readable', function(){
while(data = stringifier.read()){
process.stdout.write(data);
}
});
generator.on('end', function(){
process.stdout.write('=> ' + i + ' records\n');
});