2016-08-05 50 views
-1

我使用'json-csv'庫從嵌套對象和數組的用戶數組創建csv。對象json中的嵌套數組到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" 
     }, 
] 

現在我想生成的CSV是這樣 USERID,NAME,FBID,ACCOUNT,訂閱,價格,州TIMEPERIOD

3,Johhy萌,123456789,200,語法,10000,過期,5550

3,Johhy萌,123456789,200,GK,10340,ACTIVE,30

7,John Doe的,123456789,1500,GK,5252,已過期,30

7,約翰DOE,12345 6789,1500,MATH,200,ACTIVE,25

正如您看到的,如果每個用戶的訂閱陣列中有兩個對象,我希望再次重複該用戶,但具有不同的訂閱數據。

我想過使用庫,因爲我的用戶數組可以達到成千上萬的訂閱數以千計的用戶。

而且我不知道該怎麼做。 我的代碼:

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) 

我不想使用庫也。所以如果有人能夠提供給我一個資源來創建我自己的帶有字符串的csv文件並且也使用流,那將會很棒。謝謝!!

回答

0

這將解決您的問題。現在您只需將console.log更改爲fs並寫入您的文件。

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

將這種用於數千用戶的數組是否有效?在這個例子中,你只是將它記錄到控制檯,但我需要發送整個數據作爲響應。 –

+0

如果你不需要結果是爲了用戶在陣列中出現,那麼我可以改變它非常非常有效... –

+0

改變了答案...現在檢查@ amit-adhikari –