J'essaye de convertir le dossier de csv en json. J'utilise .
Exemple CSV:
a,b,c,d
1,2,3,4
5,6,7,8
...
JSON souhaité:
{"a": 1,"b": 2,"c": 3,"d": 4},
{"a": 5,"b": 6,"c": 7,"d": 8},
...
J'ai essayé la bibliothèque node-csv parser.Mais la sortie est comme un tableau pas comme je m'y attendais.
J'utilise Node 0.8 et express.js) et j'aimerais une recommandation sur la manière d'accomplir cela facilement.
Node.js csvtojson
module est un analyseur csv complet de nodejs. Il peut être utilisé en tant que bibliothèque d'applications node.js/un outil de ligne de commande/ou un navigateur avec l'aide de browserify
ou webpack
.
le code source peut être trouvé à: https://github.com/Keyang/node-csvtojson
Rapide avec une faible consommation de mémoire, il est puissant pour prendre en charge tous les besoins d'analyse avec une API abondante et une documentation facile à lire.
La documentation détaillée peut être trouvée ici
Utilisez-le en tant que bibliothèque dans votre application Node.js ([email protected] +):
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);
Utilisez-le comme un outil de ligne de commande:
sh# npm install csvtojson
sh# ./node_modules/csvtojson/bin/csvtojson ./youCsvFile.csv
-ou-
sh# npm install -g csvtojson
sh# csvtojson ./yourCsvFile.csv
Pour une utilisation avancée:
sh# csvtojson --help
Vous pouvez trouver plus de détails sur la page github ci-dessus.
Vous pouvez essayer d'utiliser nderscore.js
Commencez par convertir les lignes dans des tableaux en utilisant la fonction toArray :
var letters = _.toArray(a,b,c,d);
var numbers = _.toArray(1,2,3,4);
Puis objectez les tableaux ensemble en utilisant la fonction object :
var json = _.object(letters, numbers);
À ce moment-là, json var devrait contenir quelque chose comme:
{"a": 1,"b": 2,"c": 3,"d": 4}
Voici une solution qui ne nécessite pas de module séparé. Cependant, il est très grossier et n'implémente pas beaucoup le traitement des erreurs. Il pourrait également utiliser plus de tests, mais cela vous permettra de continuer. Si vous analysez des fichiers très volumineux, vous pouvez rechercher une alternative. Voir aussi ceci solution de 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);
});
});
Dû faire quelque chose de similaire, espérons que cela aide.
// 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);});
J'ai commencé avec node-csvtojson , mais cela apportait trop de dépendances pour ma liaison.
En vous appuyant sur votre question et sur le réponse de brnd , j’ai utilisé node-csv et nderscore.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);
});
});
Je n'ai pas essayé le package csv https://npmjs.org/package/csv mais d'après la documentation, il semble que la qualité de son implémentation soit http://www.adaltas.com/projects/node -csv /
J'ai une solution très simple pour imprimer JSON à partir de CSV sur console à l'aide du module csvtojson.
// 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;
Ensuite :
var ETL=require('node-etl');
var output=ETL.extract('./data.csv',{
headers:["a","b","c","d"],
ignore:(line,index)=>index!==0, //ignore first line
});
Utiliser lodash :
function csvToJson(csv) {
const content = csv.split('\n');
const header = content[0].split(',');
return _.tail(content).map((row) => {
return _.zipObject(header, row.split(','));
});
}
J'ai utilisé la bibliothèque csvtojson pour convertir la chaîne csv en tableau json. Il a une variété de fonctions qui peuvent vous aider à convertir en JSON.
Il prend également en charge la lecture de fichiers et la diffusion de fichiers en continu.
Soyez prudent lors de l'analyse du fichier csv qui peut contenir la virgule (,) ou tout autre délimiteur. Pour supprimer le délimiteur, veuillez voir ma réponse ici .
Étape 1:
Module de noeud d'installation: npm install csvtojson --save
Étape 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);
});
Utilisez bibliothèque d'analyseur csv , j'explique plus en détail comment l'utiliser ici .
var csv = require('csv');
csv.parse(csvText, {columns: true}, function(err, data){
console.log(JSON.stringify(data, null, 2));
});
Mon copain et moi avons créé un service Web pour gérer ce genre de choses.
Consultez Modifly.co pour obtenir des instructions sur la conversion de CSV en JSON avec un seul appel RESTful.