如何在节点js中读取csv文件
Posted
技术标签:
【中文标题】如何在节点js中读取csv文件【英文标题】:How to read csv file in node js 【发布时间】:2017-06-06 05:29:56 【问题描述】:我正在尝试使用节点 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)
【问题讨论】:
***.com/questions/23080413/nodejs-reading-csv-file NodeJs reading csv file的可能重复 这实际上是一个 CSV 文件,还是只是一个包含 ID 列表的文件?如果没有库,这将很容易解析,但如果您要解析真正的 CSV,请务必使用一个!我选择的模块是:npmjs.com/package/csv Hi.Bailsey 我只有一个列名 ID,并希望将它的所有值存储在一个数组中。 那么这并不是真正的 CSV,它只是一个每行都有数据的文件。你可以使用data.split('\n')
[developer.mozilla.org/en-US/docs/Web/javascript/Reference/…。它会返回一个你想要的数组。
【参考方案1】:
我使用了一个流,fs
和 csv-parse
,就像在 this answer 中一样:
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);
)
【讨论】:
【参考方案2】:来自How to read data From *.CSV file using javascript?,使用 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
的示例here的代码sn-p。
【讨论】:
【参考方案3】:使用库,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]
的值之一。
有一些关于标题处理的选项,该库可以帮助您将值填充到具有与列名匹配的属性的每一行的对象中。 TFM 位于:csv.adaltas.com/parse
但我收到错误'data.split is not a function'
我认为readFile
总是将字符串作为数据传递,但显然只有在您指定编码时才会这样做。示例已更新!
我通过这个... dataArray = data.toString().split(/\r?\n/);以上是关于如何在节点js中读取csv文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 node.js 顺序读取 csv 文件(使用流 API)