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.
'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!');
}
});
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!');
}
});
});
É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()
.
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');
});
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 "