如何在Node.js中读取CSV文件

34
我试图使用Node.js读取CSV文件。这是我的代码。

我正在尝试使用Node.js读取CSV文件。这是我的代码。

fs.readFile(config.csvUploadPath, function read(err, data) {
    if (err) {
        throw err;
    }
    console.log(data + 'my data')
});

控制台:

ID
D11
D33
D55

我想获取列ID中的元素并将它们存储到一个数组中。我该怎么做?有人可以给我建议帮助吗?谢谢。 我的控制器:

var partnersModel = new partners(params);
        fs.readFile(config.csvUploadPath, function read(err, data) {
            if (err) {
                throw err;
            }
        dataArray = data.toString().split(/\r?\n/);
            dataArray.forEach(function(v,i){
                if(v !== 'DUI'){
                  partnersModel.dui.push(v);
                }
            });
        });
        partnersModel.save(function(error, response){

1
https://dev59.com/B2Ag5IYBdhLWcg3w3eNi - Himesh Suthar
可能是NodeJs读取CSV文件的重复问题。 - Chandan Rai
这实际上是一个CSV文件还是只是一个包含ID列表的文件?如果没有使用库,这将非常容易解析,但如果您正在解析真正的CSV,请务必使用一个!我的首选模块是:https://www.npmjs.com/package/csv - le3th4x0rbot
嗨,Bailsey。我只有一个名为ID的列,并希望将其所有值存储在一个数组中。 - MMR
partnersModel.save在任何文件读取之前被调用。请使用async.waterfall或其他方法。https://www.npmjs.com/package/async - le3th4x0rbot
显示剩余2条评论
3个回答

52

使用一个库,CSV 有很多陷阱。我喜欢使用 csv 包。它可以在这里找到:https://www.npmjs.com/package/csv。以下是使用异步 API 的快速示例。

const fs = require('fs')
var parse = require('csv-parse')
fs.readFile(inputPath, function (err, fileData) {
  parse(fileData, {columns: false, trim: true}, function(err, rows) {
    // Your CSV data is in an array of arrys passed to this callback as rows.
  })
})

由于您的文件每行只有一个值且除了换行符之外没有任何分隔符,因此它只是一个微不足道的CSV。也许 String.prototype.split()对您有用?

const fs = require('fs')
fs.readFile(inputPath, 'utf8', function (err, data) {
  var dataArray = data.split(/\r?\n/);  //Be careful if you are in a \r\n world...
  // Your array contains ['ID', 'D11', ... ]
})

CSV文件通常每行有多个值,因此它返回一个数组的数组...每行一个。对于您的示例rows= [['id'], ['D11'], ['D33'], ['D55']]。请注意,标题也已解析,要索引其中一个值,您需要使用类似rows[1][0]的东西。 - le3th4x0rbot
有关头部处理的选项,该库可以帮助您将值塞入每行对象中,并使属性与列名称匹配。TFM位于此处:http://csv.adaltas.com/parse/ - le3th4x0rbot
我通过以下代码得到了它... dataArray = data.toString().split(/\r?\n/); - MMR
在您使用 'csv-parse' 的示例中,我不明白最终如何访问数据? - newandlost
@newandlost 这个示例是在 Promise 成为主流之前的,所以它使用回调函数。基本上,在最内层定义了一个匿名函数,node-csv 会用解析后的行数组来调用它。如果你还在处理这个问题,我很乐意提供一个 async/await 版本的帮助 :) - le3th4x0rbot
显示剩余2条评论

18

我像这个答案中所示,使用了一个流、fscsv-parse

const parse = require('csv-parse')
const fs = require('fs') 

const data = []
fs.createReadStream(filename)
  .pipe(parse({ delimiter: ',' }))
  .on('data', (r) => {
    console.log(r);
    data.push(r);        
  })
  .on('end', () => {
    console.log(data);
  })

1
我该如何访问数组中的数据?由于createReadStream的异步特性,某些原因导致数组长度为0,当我尝试检查它时。 - user9629064
parse未定义。 - Kyle Pennell
@KylePennell 你需要使用 const csv = require('csv-parse') 导入整个模块,然后使用 csv.parse(... 调用该模块的解析方法。 - undefined

0

如何使用 JavaScript 读取 *.CSV 文件中的数据? 开始,可以使用 jQuery-CSV 库。

注意:该库旨在处理符合 RFC 4180 的任何 CSV 数据,包括大多数“简单”解决方案忽略的所有棘手边缘情况。

var fs = require('fs');
var $ = jQuery = require('jquery');
$.csv = require('jquery-csv');

var sample = './path/to/data/sample.csv';
fs.readFile(sample, 'UTF-8', function(err, csv) {
  $.csv.toArrays(csv, {}, function(err, data) {
    for(var i=0, len=data.length; i<len; i++) {
      console.log(data[i]); //Will print every csv line as a newline
    }
  });
});

这是从 jquery-csv 的示例 这里 中提取的代码片段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接