2016-08-05 18 views
-1

Ich benutze 'JSON-CSV' Bibliothek, um eine CSV von einem Benutzer-Arrays mit verschachtelten Objekten und Arrays zu erstellen.Verschachtelte Arrays in Objekt JSON zu CSV

var users = [ 
    { 
     subscriptions: [ 
     { 
      package : { 
      name: 'Grammar' 
      }, 
      state: 'EXPIRED', 
      timerange: { 
      period : 5550 
      }, 
      transaction:{ 
      amount: 10000 
      } 
     }, 
     { 
      package : { 
      name: 'GK' 
      }, 
      state: 'ACTIVE', 
      timerange: { 
      period : 30 
      }, 
      transaction:{ 
      amount: 10340 
      } 
     }, 
     ], 
     account:{ 
     balance: 200 
     }, 
     name: "Johhy Moe", 
     email: null, 
     user_id: "123456789", 
     username: null, 
     user_type: "facebook", 
     id: 3, 
     createdAt: "2016-07-11T08:02:40.000Z", 
     updatedAt: "2016-07-11T08:02:40.000Z", 

    }, 
    { 
     subscriptions: [ 
     { 
      package : { 
      name: 'GK' 
      }, 
      state: 'EXPIRED', 
      timerange: { 
      period : 42 
      }, 
      transaction:{ 
      amount: 5252 
      } 
     }, 
     { 
      package : { 
      name: 'MATH' 
      }, 
      state: 'ACTIVE', 
      timerange: { 
      period : 25 
      }, 
      transaction:{ 
      amount: 200 
      } 
     } 
     ], 
     account:{ 
     balance: 1500 
     }, 
     name: "John Doe", 
     email: null, 
     user_id: "123456789", 
     username: null, 
     user_type: "facebook", 
     id: 7, 
     createdAt: "2016-07-29T06:44:18.000Z", 
     updatedAt: "2016-07-29T06:44:18.000Z" 
     }, 
] 

Jetzt möchte ich die erzeugte csv wie diese USERID, NAME, FBID, ACCOUNT, Abo, Preis, STATE, Timeperiod

3, Johhy Moe, 123456789.200, Grammatik, 10000 sein, ABGELAUFEN, 5550

3, Johhy Moe, 123456789.200, GK, 10340, ACTIVE, 30

7, John Doe, 123456789,1500, GK, 5252, ABGELAUFEN, 30

7, John Doe, 12345 6789,1500, MATH, 200, ACTIVE, 25

Wie Sie sehen, ob es zwei Subskriptionsarray für jeden Benutzer gibt, möchte ich diesen Benutzer erneut aber mit anderen Abonnementdaten wiederholen.

Ich habe über die Verwendung der Bibliothek gedacht, weil mein Benutzer-Array Tausende von Benutzern mit Hunderten von Abonnements erreichen kann.

Und ich bin ratlos, was ich tun soll. mein Code:

var options= { 
    fields : [ 
    { 
     name : 'id', 
     label : 'USERID' 
    }, 
    { 
     name : 'name', 
     label : 'Name' 
    }, 
    { 
     name : 'user_id', 
     label : 'FBID' 
    }, 
    { 
     name : 'account.balance', 
     label : 'ACCOUNT' 
    }, 
    { 
     name: '', 
     label: 'Subscription' 
    } 
    ] 
} 
var source = es.readArray(users) 
source 
    .pipe(jsoncsv.csv(options)) 
    .pipe(res) 

Ich möchte nicht auch eine Bibliothek verwenden. Wenn also jemand mir eine Ressource zur Verfügung stellen könnte, um meine eigene CSV-Datei mit Strings zu erstellen und Streams zu verwenden, wäre das großartig. Vielen Dank!!

Antwort

0

Dies wird Ihr Problem lösen. Jetzt müssen Sie lediglich console.log in fs ändern und in Ihre Datei schreiben.

var json2csv = function (json, listKeys) { 
    var str = ""; 
    var prefix = ""; 
    for (var i = 0; i < listKeys.length; i++) { 
     str += prefix + json[listKeys[i]]; 
     prefix = ","; 
    } 
    return str; 
}; 

var async = require('async'); 
var csvData = ['USERID,NAME,FBID,ACCOUNT,SUBSCRIPTION,PRICE,STATE,TIMEPERIOD']; 
async.each(users, function (user, callback) { 
    var csvRow1 = { 
     USERID: user.id, 
     NAME: user.name, 
     FBID: user.user_id, 
     ACCOUNT: user.account.balance 
    }; 
    async.each(user.subscriptions, function (subscription, callback) { 
     var csvRow2   = JSON.parse(JSON.stringify(csvRow1)); 
     csvRow2.SUBSCRIPTION = subscription.package.name; 
     csvRow2.PRICE  = subscription.transaction.amount; 
     csvRow2.STATE  = subscription.state; 
     csvRow2.TIMEPERIOD = subscription.timerange.period; 
     csvData.push(json2csv(csvRow2, ['USERID', 'NAME', 'FBID', 'ACCOUNT', 'SUBSCRIPTION', 'PRICE', 'STATE', 'TIMEPERIOD'])); 
     callback(null); 
    }, function (err) { 
     callback(err); 
    }); 
}, function (err) { 
    if (err) { 
     // return err; 
    } else { 
     // return csvData; 
    } 
}); 
+0

Wird dies für eine Reihe von Tausenden von Benutzern wirksam sein? In diesem Beispiel loggen Sie es nur auf der Konsole ein, aber ich muss die gesamten Daten als Antwort senden. –

+0

Wenn Sie nicht brauchen, um das Ergebnis in Reihenfolge zu sein, die Benutzer im Array erscheinen, dann kann ich es sehr sehr effizient ändern ... –

+0

änderte die Antwort ... jetzt überprüfen Sie @ amit-adhikari –

Verwandte Themen