使用node.js

时间:2015-10-12 14:38:40

标签: javascript node.js csv

我需要上传大约350MB的csv,大约3,000,000行。我只需要检查第一行的标题。有没有一种有效的方法来做到这一点?使用node-csv需要很长时间,因为它解析了整个事情。我正在使用busyboy并有一个流。

2 个答案:

答案 0 :(得分:1)

我从来没有解析过如此大的文件,但也许您可以尝试event-streamget-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');
});