2016-02-06 5 views
0

Я новичок в программировании и работаю над проектом, который получил вложенный ответ JSON от API с помощью node.js. Я надеюсь найти простой способ преобразования этого JSON в CSV для экспорта. Я немного искал, попробовал jsonexport и nestedcsv2json пакеты, но мне не удалось получить мой формат совершенно правильно, и я не могу повторить свой ответ JSON.Вложенный формат JSON в CSV Node.js

В основном ответ JSON, выглядит следующим образом:

{ '2016-01-31': { chats: 0, missed_chats: 5 }, 
'2016-02-01': { chats: 60, missed_chats: 7 }, 
'2016-02-02': { chats: 56, missed_chats: 1 }, 
'2016-02-03': { chats: 46, missed_chats: 0 }, 
'2016-02-04': { chats: 63, missed_chats: 2 }, 
'2016-02-05': { chats: 59, missed_chats: 4 }, 
'2016-02-06': { chats: 0, missed_chats: 1 } } 

Проблема Я имею в том, что размер этого может варьироваться в зависимости от диапазона дат, который входит пользователь. Поэтому мне нужно будет перебирать возвращаемые даты, а затем извлекать вложенный JSON. Это может быть одна дата или 100 дат.

Ищу сделать формат CSV с заголовками, что я могу экспортировать:

Date   Chats Missed Chats 
2016-02-02  60   7 

Это должно быть быстро и легко, но я изо всех сил, чтобы получить это совершенно верно. Любые советы или помощь приветствуются. Благодаря!

ответ

1

В результате выдается разделенная точкой с запятой строка csv. Изменить разделитель (например, заменить его на вкладке \t) в соответствии с вашими потребностями:

var json = { '2016-01-31': { chats: 0, missed_chats: 5 }, 
'2016-02-01': { chats: 60, missed_chats: 7 }, 
'2016-02-02': { chats: 56, missed_chats: 1 }, 
'2016-02-03': { chats: 46, missed_chats: 0 }, 
'2016-02-04': { chats: 63, missed_chats: 2 }, 
'2016-02-05': { chats: 59, missed_chats: 4 }, 
'2016-02-06': { chats: 0, missed_chats: 1 } }; 

var headers = 'Date;Chats;Missed chats'; 

var csv = headers + '\r\n'; 
for(key in json){ 
    csv += key + ';' + json[key].chats + ';' + json[key].missed_chats + '\r\n' 
} 
console.log(csv) 

Выход:

Date;Chats;Missed chats 
2016-01-31;0;5 
2016-02-01;60;7 
2016-02-02;56;1 
2016-02-03;46;0 
2016-02-04;63;2 
2016-02-05;59;4 
2016-02-06;0;1 

Вы можете найти рабочий пример здесь: https://jsfiddle.net/owd8zsa0/

+0

Спасибо! Это идеально подходит для моих нужд. Простой и эффективный. –

0

Этот ответ , автоматически получит заголовки (первая строка) и добавит их в CSV.

var input={ '2016-01-31': { chats: 0, missed_chats: 5 }, 
'2016-02-01': { chats: 60, missed_chats: 7 }, 
'2016-02-02': { chats: 56, missed_chats: 1 }, 
'2016-02-03': { chats: 46, missed_chats: 0 }, 
'2016-02-04': { chats: 63, missed_chats: 2 }, 
'2016-02-05': { chats: 59, missed_chats: 4 }, 
'2016-02-06': { chats: 0, missed_chats: 1 } } 

function json2csv(input){ 
    var result='' 
    var firstLine=true 
    for (var i in input){ 
     if(firstLine){ 
      firstLine=false 
      result='id\t' 
      for (var j in input[i]){ 
       result+=j +';' 
      } 
      result+='\n' 
     } 
     else{ 
      result+=i+'\t' 
      for (var j in input[i]){ 
       result+=input[i][j] +';' 
      } 
      result+='\n' 
     } 

    } 
    return result 
} 

console.log(json2csv(input)); 

Он Результат:

id;chats;missed_chats; 
2016-02-01;60;7; 
2016-02-02;56;1; 
2016-02-03;46;0; 
2016-02-04;63;2; 
2016-02-05;59;4; 
2016-02-06;0;1; 
0

Использование lodash и csv пакет:

var csv = require('csv'); 
var _ = require('lodash'); 

var obj = { 
    '2016-01-31': { chats: 0, missed_chats: 5 }, 
    '2016-02-01': { chats: 60, missed_chats: 7 }, 
    '2016-02-02': { chats: 56, missed_chats: 1 }, 
    '2016-02-03': { chats: 46, missed_chats: 0 }, 
    '2016-02-04': { chats: 63, missed_chats: 2 }, 
    '2016-02-05': { chats: 59, missed_chats: 4 }, 
    '2016-02-06': { chats: 0, missed_chats: 1 } 
}; 

// flatten obj to have an array of object like 
// { date: '2016-01-31', chats: 0, missed_chats: 5 } 
obj = _.map(obj, function (value, key) { 
    return _.merge({ date: key }, value); 
}) 

csv.stringify(obj, { header: true }, function(err, result) { 
    console.log(result); 
}); 

/* output: 
date,chats,missed_chats 
2016-01-31,0,5 
2016-02-01,60,7 
2016-02-02,56,1 
2016-02-03,46,0 
2016-02-04,63,2 
2016-02-05,59,4 
2016-02-06,0,1 
*/ 
0

"JSON ответ", показанный в этом вопросе не является технически действительным JSON, поэтому, так как это Ответ зависит от инструмента JSON (jq), первая задача - преобразовать «ответ JSON» в действительный JSON. Это можно сделать (например), используя json5 или any-json.

Предполагая, что «ответ JSON» находится в файле с именем response.txt, можно поступить следующим образом, где начальная $ означает Баш-как оболочка:

$ any-json -format json5 < response.txt | jq -r '. as $in 
    | keys[] 
    | [.] + ($in[.] | [.chats, .missed_chats ]) | @csv' 

Это производит следующий вывод:

"2016-01-31",0,5 
"2016-02-01",60,7 
"2016-02-02",56,1 
"2016-02-03",46,0 
"2016-02-04",63,2 
"2016-02-05",59,4 
"2016-02-06",0,1 

Этот вывод справедлив CSV (с запятой в качестве разделителя), но если вы хотите TSV (с вкладки в качестве разделителя), или если вы не хотите, двойные кавычки, просто замените @csv на @tsv для получения следующего выхода:

2016-01-31 0 5 
2016-02-01 60 7 
2016-02-02 56 1 
2016-02-03 46 0 
2016-02-04 63 2 
2016-02-05 59 4 
2016-02-06 0 1 

В любом случае тривиально добавить ряд заголовков (используя jq или иначе), чтобы вы могли выбрать, как с этим справиться.

Примечание: Если вы используете json5, вы выполните два шага.

Смежные вопросы