web-dev-qa-db-fra.com

Comment convertir un fichier CSV en JSON dans Node.js

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.

54
Jetson John

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

Voici quelques exemples de code:

Utilisez-le en tant que bibliothèque dans votre application Node.js ([email protected] +):

  1. Installez-le via npm

npm install --save csvtojson@latest

  1. Utilisez-le dans votre application node.js:
// 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.

71
Keyang

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}
19
brnrd

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 .

Code de module de noeud, csv2json.js:

/*
 * 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);
};

Test Jasmine, csv2jsonSpec.js:

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);
    });
});
11
Jess

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);});
10
userFog

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);
        });
     });
3
xverges

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 /

3

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);
})
2
Divyanshu Pandey

Le package Node-ETL est suffisant pour tous les traitements BI.

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
 });
2
Abdennour TOUMI

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(','));
  });
}
2
theseadroid

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 .

1
Supermacy

Si vous voulez juste un convertisseur en ligne de commande, la solution la plus rapide et la plus propre est d'utiliser csvtojson via npx (inclus par défaut dans node.js)

$ npx csvtojson ./data.csv > data.json

1
VanDavv

É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);
});
0
Mohamed Sameer

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));
});
0
ganqqwerty

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.

0
Tim Alexander