2016-08-05 28 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 –