对象json到csv

时间:2016-08-05 08:28:09

标签: json node.js csv express sails.js

我正在使用' json-csv'用于从具有嵌套对象和数组的用户数组创建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 Moe,123456789,200,Grammar,10000,EXPIRED,5550

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

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

7,John Doe,123456789,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文件并使用流,那就太棒了。谢谢!

1 个答案:

答案 0 :(得分: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;
    }
});