Javascript 如何在Node.js中将CSV转换为JSON
我正在尝试将csv文件转换为json。我正在使用 示例CSV:Javascript 如何在Node.js中将CSV转换为JSON,javascript,json,node.js,csv,express,Javascript,Json,Node.js,Csv,Express,我正在尝试将csv文件转换为json。我正在使用 示例CSV: a,b,c,d 1,2,3,4 5,6,7,8 ... 所需的JSON: {"a": 1,"b": 2,"c": 3,"d": 4}, {"a": 5,"b": 6,"c": 7,"d": 8}, ... 我尝试了节点csv解析器库。但是输出像数组,不像我期望的那样 我正在使用Node 0.8和express.js,希望得到一个关于如何轻松完成此任务的建议。您可以尝试使用 首先使用以下函数转换数组中的行: var letters
a,b,c,d
1,2,3,4
5,6,7,8
...
所需的JSON:
{"a": 1,"b": 2,"c": 3,"d": 4},
{"a": 5,"b": 6,"c": 7,"d": 8},
...
我尝试了节点csv解析器库。但是输出像数组,不像我期望的那样
我正在使用Node 0.8和express.js,希望得到一个关于如何轻松完成此任务的建议。您可以尝试使用
首先使用以下函数转换数组中的行:
var letters = _.toArray(a,b,c,d);
var numbers = _.toArray(1,2,3,4);
var json = _.object(letters, numbers);
然后使用以下函数将阵列对象化:
var letters = _.toArray(a,b,c,d);
var numbers = _.toArray(1,2,3,4);
var json = _.object(letters, numbers);
到那时,json变量应该包含如下内容:
{"a": 1,"b": 2,"c": 3,"d": 4}
我还没有尝试过csv包,但根据文档,它看起来是一个高质量的实现是一个全面的nodejs csv解析器。在
browserify
或webpack
的帮助下,它可以用作node.js应用程序库/命令行工具/或浏览器
源代码可在以下位置找到:
它速度快,内存消耗低,但功能强大,可以通过丰富的API和易于阅读的文档支持任何解析需求
详细的文档可以找到
以下是一些代码示例:
将其用作Node.js应用程序中的库(csvtojson@2.0.0+):
sh# npm install csvtojson
sh# ./node_modules/csvtojson/bin/csvtojson ./youCsvFile.csv
npm
npm安装--保存csvtojson@latest
//需要csvtojson
var csv=要求(“csvtojson”);
//使用csvtojson转换csv文件
csv()
.fromFile(csvFilePath)
.then(函数(jsonArrayObj){//解析完成后,将在此处发出结果。
console.log(jsonArrayObj);
})
//使用流/管道解析大型csv(内存消耗低)
csv()
.fromStream(readableStream)
.subscribe(函数(jsonObj){//将为每个csv行发出一个json对象
//异步解析每个json
返回新承诺(功能(解决、拒绝){
asyncStoreToDb(json,函数(){resolve()})
})
})
//使用异步/等待
const jsonArray=await csv().fromFile(filePath);
将其用作命令行工具:
sh# npm install csvtojson
sh# ./node_modules/csvtojson/bin/csvtojson ./youCsvFile.csv
-或-
对于高级使用:
sh#csvtojson——帮助
您可以从上面的github页面找到更多详细信息。这里有一个不需要单独模块的解决方案。但是,它非常粗糙,并且没有实现很多错误处理。它也可以使用更多的测试,但它会让你去。如果您正在解析非常大的文件,您可能需要寻找替代方法。还有,看看这个 节点模块代码,csv2json.js:
我和我的朋友创建了一个web服务来处理这种事情 查看有关如何通过单个RESTful调用将CSV转换为JSON的说明 我一开始是这样做的,但它给我的链接带来了太多依赖项 基于你的问题和答案,我使用了和
不得不做一些类似的事情,希望这能有所帮助
// Node packages for file system
var fs = require('fs');
var path = require('path');
var filePath = path.join(__dirname, 'PATH_TO_CSV');
// Read CSV
var f = fs.readFileSync(filePath, {encoding: 'utf-8'},
function(err){console.log(err);});
// Split on row
f = f.split("\n");
// Get first row for column headers
headers = f.shift().split(",");
var json = [];
f.forEach(function(d){
// Loop through each row
tmp = {}
row = d.split(",")
for(var i = 0; i < headers.length; i++){
tmp[headers[i]] = row[i];
}
// Add object to list
json.push(tmp);
});
var outPath = path.join(__dirname, 'PATH_TO_JSON');
// Convert object to string, write json to file
fs.writeFileSync(outPath, JSON.stringify(json), 'utf8',
function(err){console.log(err);});
//文件系统的节点包
var fs=需要('fs');
var path=require('path');
var filePath=path.join(uu dirname,'path_TO_CSV');
//读取CSV
var f=fs.readFileSync(文件路径,{encoding:'utf-8'},
函数(err){console.log(err);};
//一字排开
f=f.split(“\n”);
//获取列标题的第一行
headers=f.shift().split(“,”);
var json=[];
f、 forEach(函数(d){
//循环遍历每一行
tmp={}
行=d.拆分(“,”)
对于(变量i=0;i
使用:
包对于所有BI处理都足够了。
然后:
var ETL=require('node-etl');
var output=ETL.extract('./data.csv',{
headers:["a","b","c","d"],
ignore:(line,index)=>index!==0, //ignore first line
});
使用,我将更详细地解释如何使用它
我使用这个库将csv字符串转换为json数组。
它有多种功能,可以帮助您转换为JSON。
它还支持从文件读取和文件流 分析csv时要小心,因为csv可能包含逗号(,)或任何其他分隔符。 有关删除分隔符的信息,请参见我的答案。步骤1: 安装节点模块: npm安装csvtojson--保存 步骤2:
var Converter = require("csvtojson").Converter;
var converter = new Converter({});
converter.fromFile("./path-to-your-file.csv",function(err,result){
if(err){
console.log("Error");
console.log(err);
}
var data = result;
//to check json
console.log(data);
});
如果您只需要一个命令行转换器,那么对我来说最快捷、最干净的解决方案就是使用via(默认情况下包含在node.js中)
$npx csvtojson./data.csv>data.json
我有一个非常简单的解决方案,使用csvtojson模块在控制台上从csv打印json
// require csvtojson
var csv = require("csvtojson");
const csvFilePath='customer-data.csv' //file path of csv
csv()
.fromFile(csvFilePath)``
.then((jsonObj)=>{
console.log(jsonObj);
})
使用ES6
const toJSON = csv => {
const lines = csv.split('\n')
const result = []
const headers = lines[0].split(',')
lines.map(l => {
const obj = {}
const line = l.split(',')
headers.map((h, i) => {
obj[h] = line[i]
})
result.push(obj)
})
return JSON.stringify(result)
}
const csv = `name,email,age
francis,francis@gmail.com,33
matty,mm@gmail.com,29`
const data = toJSON(csv)
console.log(data)
输出
// [{"name":"name","email":"email","age":"age"},{"name":"francis","email":"francis@gmail.com","age":"33"},{"name":"matty","email":"mm@gmail.com","age":"29"}]
npm安装csvjson——保存 在您的节点JS文件中
const csvjson=require('csvjson');
convertCSVToJSON(*.csv);
convertCSVToJSON=(文件)=>{
const convertedObj=csvjson.toObject(文件);
}
已添加代码。从0.3.0版开始,csvtojson不依赖于任何其他库,请参见此处的更详细文档。它的行为将类似于一个适当的流对象。指向博客的链接已失效。已更新。谢谢你让我知道。我不知道这是否只发生在我身上,但对于一个大的CSV文件来说,这会变慢。大概比d3慢10秒,看起来令人印象深刻。我写了一篇关于brnrd提出的类似解决方案的小博文:异步和下划线对你来说太多了?@Spencer,在我发布的时候,依赖项是不同的:拉入express进行csv转换感觉不自然,是的,这是一个疯狂的依赖项。我的错,这个没有csvtojson那么好用。当我有“2016年8月23日”时,它将2016年8月23日和2016年8月23日分为不同的夏季。您可以用引号将日期括起来来修复它?或者甚至var json=f.map(函数(d,i){…return tmp;}
指向此库的链接已断开-可能它已移动到Github上的其他地方(或forked?)。请更新链接。谢谢@RohitParte。这是我在NodeJs中的第一个模块之一。虽然一些功能工作正常,但它缺少很多功能。我开始忙于其他事情(Reliab)
var Converter = require("csvtojson").Converter;
var converter = new Converter({});
converter.fromFile("./path-to-your-file.csv",function(err,result){
if(err){
console.log("Error");
console.log(err);
}
var data = result;
//to check json
console.log(data);
});
// require csvtojson
var csv = require("csvtojson");
const csvFilePath='customer-data.csv' //file path of csv
csv()
.fromFile(csvFilePath)``
.then((jsonObj)=>{
console.log(jsonObj);
})
const toJSON = csv => {
const lines = csv.split('\n')
const result = []
const headers = lines[0].split(',')
lines.map(l => {
const obj = {}
const line = l.split(',')
headers.map((h, i) => {
obj[h] = line[i]
})
result.push(obj)
})
return JSON.stringify(result)
}
const csv = `name,email,age
francis,francis@gmail.com,33
matty,mm@gmail.com,29`
const data = toJSON(csv)
console.log(data)
// [{"name":"name","email":"email","age":"age"},{"name":"francis","email":"francis@gmail.com","age":"33"},{"name":"matty","email":"mm@gmail.com","age":"29"}]