94 votes

Comment convertir CSV en JSON dans Node.js

J'essaie de convertir un fichier csv en fichier 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 le résultat ressemble à un tableau et non à ce que j'attendais.

J'utilise Node 0.8 et express.js et j'aimerais avoir une recommandation sur la façon d'accomplir cela facilement.

122voto

Keyang Points 253

Node.js csvtojson module est un parseur csv nodejs complet. Il peut être utilisé comme une bibliothèque d'application node.js / un outil en ligne de commande / ou un navigateur avec l'aide de browserify o webpack .

le code source est disponible à l'adresse suivante https://github.com/Keyang/node-csvtojson

Il est rapide et consomme peu de mémoire, mais il est puissant pour répondre à tous les besoins d'analyse syntaxique grâce à une API abondante et à une documentation facile à lire.

La documentation détaillée est disponible à l'adresse suivante aquí

Voici quelques exemples de code :

Utilisez-le comme bibliothèque dans votre application Node.js (csvtojson@2.0.0 +) :

  1. L'installer par l'intermédiaire de 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.

24voto

brnrd Points 717

Vous pouvez essayer d'utiliser underscore.js

Il faut d'abord convertir les lignes en tableaux à l'aide de la fonction toArray fonction :

var letters = _.toArray(a,b,c,d);
var numbers = _.toArray(1,2,3,4);

Ensuite, liez les tableaux entre eux à l'aide de la fonction objet fonction :

var json = _.object(letters, numbers);

A ce moment-là, le fichier json devrait contenir quelque chose comme :

{"a": 1,"b": 2,"c": 3,"d": 4}

23voto

userFog Points 31

J'ai dû faire quelque chose de similaire, j'espère que cela vous aidera.

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

13voto

Jess Points 2039

Voici une solution qui ne nécessite pas de module séparé. Cependant, elle est très rudimentaire et n'implémente pas beaucoup de gestion d'erreurs. Il pourrait aussi y avoir plus de tests, mais cela vous permettra d'avancer. Si vous traitez de très gros fichiers, vous pouvez chercher une autre solution. Voir aussi solution de Ben Nadel .

Code du module Node, 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);
    });
});

6voto

VanDavv Points 405

Si vous ne voulez qu'un convertisseur en ligne de commande, la solution la plus rapide et la plus propre pour moi est d'utiliser csvtojson vía npx (inclus par défaut dans node.js)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X