javascript - Generisk måte å konvertere Json til CSV på for generiske dypt nestede arrayer
Jeg programmerer en funksjon som skal konvertere generiske dypt nestede JSON-objektnivåer til CSV-fil i JS eller TypeScript. Jeg har prøvd flere biblioteker, men på en eller annen måte fungerer de ikke slik jeg vil for å pakke ut den nestede JSON-en riktig. Koden skal pakke ut denne inputen:
{
[
{
app: "app1",
device: [
"c1",
"c2",
"c3",
"c4"
]
},
{
app: "app2",
device: [
"b1",
"b2"
]
}
]
}
Inn i dette forventede resultatet:
app;device
app1;c1
app1;c2
app1;c3
app1;c4
app2;b1
app2;b2
Akkurat nå bruker jeg denne koden, men resultatet er ikke som forventet:
private ConvertToCSV(json: string, fields: string[]): string {
const Json2csvParser = require("json2csv").Parser;
let options: {};
options = { fields };
const parser = new Json2csvParser(options);
const csv = parser.parse(JSON.parse(json));
console.log(JSON.parse(json));
console.log(csv);
return csv;
}
Mitt resultat ser akkurat nå slik ut:
"app","device"
"app1","[""c1"",""c2"",""c3"",""c4""]"
"app2","[""b1"",""b2""]"
Svar #1
Ja, du kan gjøre dette -- det står rett i dokumentasjonen med unwind-funksjonen, selv om du kanskje må legge til en transformator for å formatere det akkurat slik du vil. Ta en titt:
const data: any = [
{
app: "app1",
device: [
"c1",
"c2",
"c3",
"c4"
]
},
{
app: "app2",
device: [
"b1",
"b2"
]
}
];
function ConvertToCSV(json: string, fields: any): string {
const Json2csvParser = require("json2csv").parse;
let options: {};
options = fields;
const csv = Json2csvParser(JSON.parse(json), options);
console.log(JSON.parse(json));
console.log(csv);
return csv;
}
ConvertToCSV(JSON.stringify(data), {fields: ['app', 'device'], unwind: 'device'});
Gi meg beskjed hvis dette løser problemet ditt, eller hvis det ikke gjør det. Jeg har litt erfaring med dette biblioteket og kan kanskje hjelpe
Svar #2
Jeg vil anbefale å flate ut dataene dine og deretter bare bruke CSV-parseren du har.
function flattenData(data,groupingField,flattenedField) {
let flattenedData =[];
data.forEach(d => {
d[flattenedField].forEach(sd => {
flattenedData.push({[groupingField]: d[groupingField], [flattenedField]: sd});
});
});
return flattenedData;
}
Da vil du ha en datastruktur som csv-parseren din vet hvordan den skal håndtere.
