2016-08-05 14 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、SUBSCRIPTION、PRICE、STATE、時間期間

3、Johhy萌え、123456789,200、文法、10000、のようになりたいですEXPIRED、5550

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

7、ジョン・ドウ、123456789,1500、GK、5252、EXPIRED、30

7、ジョンDoe、12345ユーザーごとにサブスクリプションアレイ内に2つのオブジェクトがある場合は、そのユーザーをもう一度繰り返すが、サブスクリプションデータは異なる。

ユーザーアレイが数百のサブスクリプションを持つ何千ものユーザーになる可能性があるので、私はライブラリを使用することを考えました。

私は何をすべきか迷っています。 私のコード:

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をチェックしてください –

関連する問題