web-dev-qa-db-fra.com

Comment convertir un tableau JSON en CSV en utilisant Node.js?

Je veux convertir json qui a un tableau de valeurs. response.json

{
"rows": [
[
  "New Visitor",
  "(not set)",
  "(not set)",      
  "0"
],
[
  "New Visitor",
  "(not set)",
  "(not set)",
  "mobile"      
],
[
  "New Visitor",
  "(not set)",
  "(not set)",
  "mobile"    
],
  [
    "New Visitor",
    "(not set)",
    "(not set)",
   "mobile",      
  ]
 ]
}

Maintenant, je veux convertir ces données. name.csv

 "New Visitor","(not set)","(not set)","0"
 "New Visitor","(not set)","(not set)","mobile"        
 "New Visitor","(not set)","(not set)","mobile"    
 "New Visitor","(not set)","(not set)","mobile"

Veuillez me donner des suggestions en utilisant Node.js.

13
arjun kori

Faites-le vous-même comme ceci:

'use strict';

var fs = require('fs');

let myObj = {
  "rows": [
    [
      "New , Visitor",
      "(not set)",
      "(not set)",
      "0"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile",
    ]
  ]
}

// 1. One way - if you want the results to be in double quotes and you have comas inside

// choose another string to temporally replace commas if necessary
let stringToReplaceComas = '!!!!';

myObj.rows.map((singleRow) => {
  singleRow.map((value, index) => {
    singleRow[index] = value.replace(/,/g, stringToReplaceComas);
  })
})

let csv = `"${myObj.rows.join('"\n"').replace(/,/g, '","')}"`;
// // or like this
// let csv = `"${myObj.rows.join('"\n"').split(',').join('","')}"`;

csv = csv.replace(new RegExp(`${stringToReplaceComas}`, 'g'), ',');

// // 2. Another way - if you don't need the double quotes in the generated csv and you don't have comas in rows' values
// let csv = myObj.rows.join('\n')

fs.writeFile('name.csv', csv, 'utf8', function(err) {
  if (err) {
    console.log('Some error occured - file either not saved or corrupted file saved.');
  } else {
    console.log('It\'s saved!');
  }
});

Utiliser des bibliothèques

ex. https://github.com/mrodrig/json-2-csv , https://github.com/wdavidw/node-csv , https: //github.com/wdavidw/node-csv-stringify

un exemple utilisant json-2-csv ( https://github.com/mrodrig/json-2-csv )

'use strict';

const converter = require('json-2-csv');

let myObj = {
  "rows": [
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "0"
    },
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "mobile"
    },
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "mobile"
    },
    {
      value1: "New Visitor",
      value2: "(not set)",
      value3: "(not set)",
      value4: "mobile",
    }
  ]
}

let json2csvCallback = function (err, csv) {
    if (err) throw err;
    fs.writeFile('name.csv', output, 'utf8', function(err) {
      if (err) {
        console.log('Some error occured - file either not saved or corrupted file saved.');
      } else {
        console.log('It\'s saved!');
      }
    });
};

converter.json2csv(myObj.rows, json2csvCallback, {
  prependHeader: false      // removes the generated header of "value1,value2,value3,value4" (in case you don't want it)
});

un exemple utilisant csv-stringify ( https://github.com/wdavidw/node-csv-stringify )

'use strict';

var stringify = require('csv-stringify');
var fs = require('fs');

let myObj = {
  "rows": [
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "0"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile",
    ]
  ]
}

stringify(myObj.rows, function(err, output) {
  fs.writeFile('name.csv', output, 'utf8', function(err) {
    if (err) {
      console.log('Some error occured - file either not saved or corrupted file saved.');
    } else {
      console.log('It\'s saved!');
    }
  });
});
18
Relu Mesaros

Trois étapes faciles: lire. Convertir. Écrire.

Étape 1: lire.

Si vous devez lire le JSON d'un fichier (comme indiqué par votre inclusion du nom de fichier response.json Dans votre message), vous aurez besoin de Node.js FileSystem API :

const fs = require('fs');                          // Require Node.js FileSystem API.
const JSONFile = fs.readFileSync('response.json'); // Read the file synchronously.

Remarque: Si vous préférez, vous pouvez lire le fichier de manière asynchrone avec fs.readFile() et effectuer la conversion dans une fonction de rappel.

Étape 2: Convertir.

Que vous lisiez votre JSON à partir d'un fichier local ou que vous l'obteniez à partir d'un serveur, vous devrez d'abord l'analyser dans un vieil objet JavaScript simple en utilisant la méthode JSON.parse :

const JSONasPOJO = JSON.parse(JSONFile); // Parse JSON into POJO.

Effectuez ensuite une série de jointures sur les tableaux enfants et le tableau parent:
VOIR [~ # ~] modifier [~ # ~] CI-DESSOUS

/* THIS IS UNNECESSARY FOR "COMMA" SEPARATED VALUES
const CSVString = JSONasPOJO
    .rows                    // Get `rows`, which is an array.
    .map(                    // Map returns a new array.
        row => row.join(',') // Each child array becomes a comma-separated string.  
     )                    
    .join('\n');             // Parent array becomes a newline-separated string...
                             // ...of comma-separated strings.
                             // It is now a single CSV string!
*/

MODIFIER:

Bien que le code précédent fonctionne certainement, il n'est pas nécessaire d'utiliser .map Et .join Sur les tableaux enfants. Comme @ Relu le démontre , un seul .join Sur le tableau parent est suffisant car JavaScript convertira automatiquement les tableaux enfants en chaînes séparées par des virgules par défaut puisque .join Doit retourner une chaîne et ne peut contenir aucun tableau enfant.

Vous pouvez utiliser le modèle ci-dessus si vous souhaitez joindre les tableaux enfants avec autre chose qu'une virgule.

Sinon:

var CSVString = JSONasPOJO.rows.join('\n'); // Array becomes a newline-separated...
                                            // ...string of comma-separated strings.
                                            // It is now a single CSV string!

Ici, nous pouvons voir cette conversion en action:

const JSONasPOJO = {
  "rows": [
    [
      "New Visitor",
      "(not set)",
      "(not set)",      
      "0"
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"      
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile"    
    ],
    [
      "New Visitor",
      "(not set)",
      "(not set)",
      "mobile" // NOTE: Here I removed a trailing comma,
               // ...which is invalid JSON!
    ]
  ]
}

const CSVString = JSONasPOJO.rows.join('\n');

console.log(CSVString);

Étape 3: Écrire.

En utilisant à nouveau l'API FileSystem, écrivez dans un fichier et enregistrez une erreur ou un message de réussite:

fs.writeFile('name.csv', CSVString, err => {
    if (err) return console.log(err);
    console.log('FILE SUCCESSFULLY WRITTEN!\n');
});

Remarque: ici, je montre le modèle asynchrone en utilisant un rappel pour enregistrer mes messages d'erreur et de réussite. Si vous préférez, vous pouvez écrire le fichier de manière synchrone avec fs.writeFileSync() .

Mettre tous ensemble

J'aime ajouter plein de messages console.log() à mes scripts Node.js.

const fs = require('fs');

const inFilename  = 'response.json',
      outFilename = 'name.csv';

console.log('\nPreparing to read from ' + inFilename + ' ...');

const JSONContents = fs.readFileSync(inFilename);

console.log('READ:');
console.log(JSONContents);

console.log('\nPreparing to parse as JSON ...');

const JSONasPOJO = JSON.parse(JSONContents);

console.log('PARSED:');
console.log(JSONasPOJO);

console.log('\nPreparing to convert into CSV ...');

const CSVString = JSONasPOJO.rows.join('\n');

console.log('CONVERTED:');
console.log(CSVString);

console.log('\nPreparing to write to ' + outFilename + '...');

fs.writeFile(outFilename, CSVString, err => {
    if (err) return console.log(err);
    console.log('FILE SUCCESSFULLY WRITTEN!\n');
});
7
gfullam

Je voudrais partager la manière la plus simple de construire une chaîne csv à partir d'un tableau json:

const data = [
  { a: 1, b: new Date(), c: 'a text' },
  {
    a: 1, b: new Date(), c: `string
  with
  return
  carrier
  and emoji ????
  `
  }
]

const header = Object.keys(data[0]).map(_ => JSON.stringify(_)).join(';') + '\n'
const outData = data.reduce((acc, row) => {
  return acc + Object.values(row).map(_ => JSON.stringify(_)).join(';') + '\n'
}, header)

console.log(outData)

Imprime cette chaîne:

"a";"b";"c"
1;"2020-03-25T08:49:04.280Z";"a text"
1;"2020-03-25T08:49:04.280Z";"string\n  with\n  return\n  carrier\n  and emoji ????\n  "
0
Manuel Spigolon