库建议:NodeJs读取csv文件

lon*_*ymo 99 csv node.js

使用nodejs,我想解析10000个记录的.csv文件,并对每一行进行一些操作.我尝试使用http://www.adaltas.com/projects/node-csv.我不能让它在每一行停下来.这只是读取所有10000条记录.我需要做以下事情

  1. 逐行读取csv
  2. 在每一行上执行耗时的操作
  3. 转到下一行

任何人都可以在这里建议任何其他想法?

Ris*_*vik 73

好像你需要使用一些基于流的解决方案,已经存在这样的库,所以在重新发明自己之前,尝试这个库,其中还包括验证支持.https://www.npmjs.org/package/fast-csv

  • NodeCSV也得到很好的支持,并且恰好有大约一个数量级的用户.https://www.npmjs.com/package/csv (21认同)
  • fast-csv快速,易用且易于使用. (4认同)

pru*_*ule 48

我当前的解决方案使用异步模块来串行执行:

var fs = require('fs');
var parse = require('csv-parse');
var async = require('async');

var inputFile='myfile.csv';

var parser = parse({delimiter: ','}, function (err, data) {
  async.eachSeries(data, function (line, callback) {
    // do something with the line
    doSomething(line).then(function() {
      // when processing finishes invoke the callback to move to the next one
      callback();
    });
  })
});
fs.createReadStream(inputFile).pipe(parser);
Run Code Online (Sandbox Code Playgroud)


vin*_*eet 47

我用这种方式: -

var fs = require('fs'); 
var parse = require('csv-parse');

var csvData=[];
fs.createReadStream(req.file.path)
    .pipe(parse({delimiter: ':'}))
    .on('data', function(csvrow) {
        console.log(csvrow);
        //do something with csvrow
        csvData.push(csvrow);        
    })
    .on('end',function() {
      //do something wiht csvData
      console.log(csvData);
    });
Run Code Online (Sandbox Code Playgroud)

  • 目前,parse 是一个命名导出 var { parse } = require("csv-parse"); (8认同)
  • 好的解决方案 适合我. (3认同)
  • 遗憾的是这很糟糕 - 我得到了巨大的文件和长行的错误....(内存错误 - 虽然其他阅读方式 - 工作) (3认同)
  • 遗憾的是,这会添加到数组中,但只能通过 .on('end') 访问,而不能在该语句之外访问。我认为这是由于它是同步的。异步功能需要解释。 (3认同)
  • 我可能做错了,但是当我运行它时,没有定义`parse`.有什么我想念的吗?当我运行`npm install csv-parse`然后在我的代码中添加`var parse = require("csv-parse");`,然后它就可以了.你确定你的作品吗?无论哪种方式,我都喜欢这个解决方案(即使我必须包含`csv-parse`模块 (2认同)

小智 16

var fs = require("fs");
// READ CSV INTO STRING
var data = fs.readFileSync("your.csv").toLocaleString();

// STRING TO ARRAY
var rows = data.split("\n"); // SPLIT ROWS
rows.forEach((row) => {
    columns = row.split(","); //SPLIT COLUMNS
    console.log(columns);
})
Run Code Online (Sandbox Code Playgroud)

  • 将整个文件读入内存通常是一个坏主意,事后将其拆分更糟糕;现在内存中的文件大小增加了一倍。 (4认同)

小智 10

您正在引用的node-csv项目完全足以完成转换大部分CSV数据的每一行的任务,来自以下文档:http://csv.adaltas.com/transform/:

csv()
  .from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge')
  .to(console.log)
  .transform(function(row, index, callback){
    process.nextTick(function(){
      callback(null, row.reverse());
    });
});
Run Code Online (Sandbox Code Playgroud)

根据我的经验,我可以说它也是一个相当快速的实现,我一直在处理具有接近10k记录的数据集,并且整个集合的处理时间在合理的几十毫秒级别.

借助jurka的基于流的解决方案建议:node-csv是基于流的,并遵循Node.js的流API.


adn*_*ili 9

要在fast-csv中暂停流式传输,您可以执行以下操作:

let csvstream = csv.fromPath(filePath, { headers: true })
    .on("data", function (row) {
        csvstream.pause();
        // do some heavy work
        // when done resume the stream
        csvstream.resume();
    })
    .on("end", function () {
        console.log("We are done!")
    })
    .on("error", function (error) {
        console.log(error)
    });
Run Code Online (Sandbox Code Playgroud)


Pra*_*ari 9

  • 此解决方案使用csv-parser而不是csv-parse在上面的一些答案中使用.
  • csv-parser大约两年后来了 csv-parse.
  • 它们都解决了相同的目的,但我个人发现 csv-parser它更好,因为通过它可以很容易地处理标题.

首先安装csv-parser:

npm install csv-parser
Run Code Online (Sandbox Code Playgroud)

所以假设你有一个像这样的csv文件:

NAME, AGE
Lionel Messi, 31
Andres Iniesta, 34
Run Code Online (Sandbox Code Playgroud)

您可以执行以下所需的操作:

const fs = require('fs'); 
const csv = require('csv-parser');

fs.createReadStream(inputFilePath)
.pipe(csv())
.on('data', function(data){
    try {
        console.log("Name is: "+data.NAME);
        console.log("Age is: "+data.AGE);

        //perform the operation
    }
    catch(err) {
        //error handler
    }
})
.on('end',function(){
    //some final operation
});  
Run Code Online (Sandbox Code Playgroud)

如需进一步阅读参考

  • 感谢分享。“csv-parser”的最大好处之一是包的大小。`csv-parser` 约为 27KB,而 `csv-parse` 约为 1.6MB。 (3认同)
  • `csv-parser` 最适合我,特别是以数据格式获取它 (2认同)

小智 6

快速CSV NPM模块可以读取数据线,由线从csv文件。

这是一个例子:

let csv= require('fast-csv');

var stream = fs.createReadStream("my.csv");

csv
 .fromStream(stream, {headers : true})
 .on("data", function(data){
     console.log('I am one line of data', data);
 })
 .on("end", function(){
     console.log("done");
 });
Run Code Online (Sandbox Code Playgroud)


ale*_*xkb 5

我需要一个异步 csv 阅读器,最初尝试@Pransh Tiwari 的答案,但无法使用awaitutil.promisify()。最终我遇到了node-csvtojson,它与 csv-parser 几乎一样,但有承诺。以下是 csvtojson 的示例用法:

const csvToJson = require('csvtojson');

const processRecipients = async () => {
    const recipients = await csvToJson({
        trim:true
    }).fromFile('./recipients.csv');

    // Code executes after recipients are fully loaded.
    recipients.forEach((recipient) => {
        console.log(recipient.name, recipient.email);
    });
};
Run Code Online (Sandbox Code Playgroud)