我正在尝试将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},
...
我尝试了node-csv解析器库。但是输出类似于数组,与我预期的不一样。
我正在使用Node 0.8和express.js,希望就如何轻松实现这一目标提出建议。
我正在尝试将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},
...
我尝试了node-csv解析器库。但是输出类似于数组,与我预期的不一样。
我正在使用Node 0.8和express.js,希望就如何轻松实现这一目标提出建议。
Answers:
Node.jscsvtojson
模块是一个全面的nodejs csv解析器。它可以用来作为Node.js的应用程序库/命令行工具/或与帮助浏览器browserify
或webpack
。
可以在以下位置找到源代码:https : //github.com/Keyang/node-csvtojson
它运行速度快,内存消耗低,但功能强大,具有丰富的API和易于阅读的文档,可满足任何分析需求。
详细的文档可以在这里找到
将其用作Node.js应用程序(csvtojson@2.0.0 +)中的库:
npm
npm install --save csvtojson@latest
// require csvtojson
var csv = require("csvtojson");
// Convert a csv file with csvtojson
csv()
.fromFile(csvFilePath)
.then(function(jsonArrayObj){ //when parse finished, result will be emitted here.
console.log(jsonArrayObj);
})
// Parse large csv with stream / pipe (low mem consumption)
csv()
.fromStream(readableStream)
.subscribe(function(jsonObj){ //single json object will be emitted for each csv line
// parse each json asynchronousely
return new Promise(function(resolve,reject){
asyncStoreToDb(json,function(){resolve()})
})
})
//Use async / await
const jsonArray=await csv().fromFile(filePath);
将其用作命令行工具:
sh# npm install csvtojson
sh# ./node_modules/csvtojson/bin/csvtojson ./youCsvFile.csv
-要么-
sh# npm install -g csvtojson
sh# csvtojson ./yourCsvFile.csv
对于高级用法:
sh# csvtojson --help
您可以从上面的github页面找到更多详细信息。
您可以尝试使用underscore.js
首先使用toArray函数转换数组中的行:
var letters = _.toArray(a,b,c,d);
var numbers = _.toArray(1,2,3,4);
然后使用对象函数将数组对象在一起:
var json = _.object(letters, numbers);
届时,json var应该包含类似以下内容:
{"a": 1,"b": 2,"c": 3,"d": 4}
这是不需要单独模块的解决方案。但是,它非常粗糙,并且没有实现太多错误处理。它还可以使用更多测试,但可以助您一臂之力。如果要解析非常大的文件,则可能需要寻找替代方法。另外,请参见Ben Nadel的解决方案。
/*
* Convert a CSV String to JSON
*/
exports.convert = function(csvString) {
var json = [];
var csvArray = csvString.split("\n");
// Remove the column names from csvArray into csvColumns.
// Also replace single quote with double quote (JSON needs double).
var csvColumns = JSON
.parse("[" + csvArray.shift().replace(/'/g, '"') + "]");
csvArray.forEach(function(csvRowString) {
var csvRow = csvRowString.split(",");
// Here we work on a single row.
// Create an object with all of the csvColumns as keys.
jsonRow = new Object();
for ( var colNum = 0; colNum < csvRow.length; colNum++) {
// Remove beginning and ending quotes since stringify will add them.
var colData = csvRow[colNum].replace(/^['"]|['"]$/g, "");
jsonRow[csvColumns[colNum]] = colData;
}
json.push(jsonRow);
});
return JSON.stringify(json);
};
var csv2json = require('csv2json.js');
var CSV_STRING = "'col1','col2','col3'\n'1','2','3'\n'4','5','6'";
var JSON_STRING = '[{"col1":"1","col2":"2","col3":"3"},{"col1":"4","col2":"5","col3":"6"}]';
/* jasmine specs for csv2json */
describe('csv2json', function() {
it('should convert a csv string to a json string.', function() {
expect(csv2json.convert(CSV_STRING)).toEqual(
JSON_STRING);
});
});
不得不做类似的事情,希望这会有所帮助。
// 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 json = f.map(function(d, i){ ... return tmp; }
使用lodash:
function csvToJson(csv) {
const content = csv.split('\n');
const header = content[0].split(',');
return _.tail(content).map((row) => {
return _.zipObject(header, row.split(','));
});
}
const header = content[0].split(',').map(function(str) { return _.trim(str, '"'); });
和return _.zipObject(header, row.split(',').map(function(str) { return _.trim(str, '"'); }));
我还没有尝试过csv包https://npmjs.org/package/csv, 但是根据文档,它看起来质量不错,实现方式http://www.adaltas.com/projects/node-csv/
我从node-csvtojson开始,但是它给我的链接带来了太多的依赖。
基于brnd的问题和答案,我使用了node-csv和underscore.js。
var attribs;
var json:
csv()
.from.string(csvString)
.transform(function(row) {
if (!attribs) {
attribs = row;
return null;
}
return row;
})
.to.array(function(rows) {
json = _.map(rows, function(row) {
return _.object(attribs, row);
});
});
我有一个非常简单的解决方案,可以使用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);
})
npm install node-etl;
然后 :
var ETL=require('node-etl');
var output=ETL.extract('./data.csv',{
headers:["a","b","c","d"],
ignore:(line,index)=>index!==0, //ignore first line
});
第1步:
安装节点模块:npm install csvtojson --save
第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);
});
使用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"}]
我和我的好友创建了一个Web服务来处理这种事情。
请查看Modifly.co,以获取有关如何通过单个RESTful调用将CSV转换为JSON的说明。