Як перетворити JSON у формат CSV та зберегти у змінній


99

У мене є посилання, яке відкриває дані JSON у браузері, але, на жаль, я не знаю, як їх читати. Чи є спосіб перетворити ці дані за допомогою JavaScript у форматі CSV та зберегти їх у файлі JavaScript?

Дані виглядають так:

{
  "count": 2,
  "items": [{
    "title": "Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust)",
    "description": "Advertise here with BSA Apple cancelled its scheduled sale of iPhone 4S in one of its stores in China\u2019s capital Beijing on January 13. Crowds outside the store in the Sanlitun district were waiting on queues overnight. There were incidents of scuffle between shoppers and the store\u2019s security staff when shoppers, hundreds of them, were told that the sales [...]Source : Design You TrustExplore : iPhone, iPhone 4, Phone",
    "link": "http:\/\/wik.io\/info\/US\/309201303",
    "timestamp": 1326439500,
    "image": null,
    "embed": null,
    "language": null,
    "user": null,
    "user_image": null,
    "user_link": null,
    "user_id": null,
    "geo": null,
    "source": "wikio",
    "favicon": "http:\/\/wikio.com\/favicon.ico",
    "type": "blogs",
    "domain": "wik.io",
    "id": "2388575404943858468"
  }, {
    "title": "Apple to halt sales of iPhone 4S in China (Fame Dubai Blog)",
    "description": "SHANGHAI \u2013 Apple Inc said on Friday it will stop selling its latest iPhone in its retail stores in Beijing and Shanghai to ensure the safety of its customers and employees. Go to SourceSource : Fame Dubai BlogExplore : iPhone, iPhone 4, Phone",
    "link": "http:\/\/wik.io\/info\/US\/309198933",
    "timestamp": 1326439320,
    "image": null,
    "embed": null,
    "language": null,
    "user": null,
    "user_image": null,
    "user_link": null,
    "user_id": null,
    "geo": null,
    "source": "wikio",
    "favicon": "http:\/\/wikio.com\/favicon.ico",
    "type": "blogs",
    "domain": "wik.io",
    "id": "16209851193593872066"
  }]
}

Найближче, що я міг знайти: перетворити формат JSON на формат CSV для MS Excel

Але він завантажується у файл CSV, я зберігаю його у змінній, цілі перетворені дані.

Також хотів би знати, як змінити символи втечі: '\u2019'повернутися до звичайного.


Я спробував цей код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>JSON to CSV</title>
  <script src="http://code.jquery.com/jquery-1.7.1.js" type="text/javascript"></script>
  <script type="text/javascript">
    var json3 = {
      "count": 2,
      "items": [{
          "title": "Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust)",
          "description": "Advertise here with BSA Apple cancelled its scheduled sale of iPhone 4S in one of its stores in China’s capital Beijing on January 13. Crowds outside the store in the Sanlitun district were waiting on queues overnight. There were incidents of scuffle between shoppers and the store’s security staff when shoppers, hundreds of them, were told that the sales [...]Source : Design You TrustExplore : iPhone, iPhone 4, Phone",
          "link": "http://wik.io/info/US/309201303",
          "timestamp": 1326439500,
          "image": null,
          "embed": null,
          "language": null,
          "user": null,
          "user_image": null,
          "user_link": null,
          "user_id": null,
          "geo": null,
          "source": "wikio",
          "favicon": "http://wikio.com/favicon.ico",
          "type": "blogs",
          "domain": "wik.io",
          "id": "2388575404943858468"
        },
        {
          "title": "Apple to halt sales of iPhone 4S in China (Fame Dubai Blog)",
          "description": "SHANGHAI – Apple Inc said on Friday it will stop selling its latest iPhone in its retail stores in Beijing and Shanghai to ensure the safety of its customers and employees. Go to SourceSource : Fame Dubai BlogExplore : iPhone, iPhone 4, Phone",
          "link": "http://wik.io/info/US/309198933",
          "timestamp": 1326439320,
          "image": null,
          "embed": null,
          "language": null,
          "user": null,
          "user_image": null,
          "user_link": null,
          "user_id": null,
          "geo": null,
          "source": "wikio",
          "favicon": "http://wikio.com/favicon.ico",
          "type": "blogs",
          "domain": "wik.io",
          "id": "16209851193593872066"
        }
      ]
    }
    //var objJson = JSON.parse(json3.items);

    DownloadJSON2CSV(json3.items);

    function DownloadJSON2CSV(objArray) {
      var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;

      var str = '';

      for (var i = 0; i < array.length; i++) {
        var line = '';

        for (var index in array[i]) {
          line += array[i][index] + ',';
        }

        line.slice(0, line.Length - 1);

        str += line + '\r\n';
      }
      $('div').html(str);
    }
  </script>

</head>

<body>
  <div></div>
</body>

</html>

Але це, здається, не працює. Хтось може допомогти?



у вас там хороший код. рядок, який завантажується, - window.open ("data: text / csv; charset = utf-8," + escape (str)) .. просто пропустіть його, якщо він вам не потрібен. і рядок csv зберігається у цій змінній: str
zdrsh

CSV не може обробляти різні рівні даних (а також) як JSON. Як би ви очікували, що ваш JSON буде виглядати як CSV? 2,Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust), ...?
Стефан

Я хотів би, щоб мої дані виглядали так: Продаж Apple iPhone 4S скасовано в Пекіні на тлі хаосу (Дизайн, якому ви довіряєте), Рекламуйте тут за допомогою BSA Apple скасувала запланований продаж iPhone 4S в одному зі своїх магазинів .. ,,,,,, тощо Я можу легко видалити ці початкові символи: "{" count ": 2," items ": [:"
praneybehl

@zdrsh так, але з якихось причин я не можу змусити його працювати.
praneybehl

Відповіді:


154

Більш елегантний спосіб перетворити json на csv - це використання функції map без будь-якої структури:

var json = json3.items
var fields = Object.keys(json[0])
var replacer = function(key, value) { return value === null ? '' : value } 
var csv = json.map(function(row){
  return fields.map(function(fieldName){
    return JSON.stringify(row[fieldName], replacer)
  }).join(',')
})
csv.unshift(fields.join(',')) // add header column
 csv = csv.join('\r\n');
console.log(csv)

Вихід:

title,description,link,timestamp,image,embed,language,user,user_image,user_link,user_id,geo,source,favicon,type,domain,id
"Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust)","Advertise here with BSA Apple cancelled its scheduled sale of iPhone 4S in one of its stores in China’s capital Beijing on January 13. Crowds outside the store in the Sanlitun district were waiting on queues overnight. There were incidents of scuffle between shoppers and the store’s security staff when shoppers, hundreds of them, were told that the sales [...]Source : Design You TrustExplore : iPhone, iPhone 4, Phone","http://wik.io/info/US/309201303","1326439500","","","","","","","","","wikio","http://wikio.com/favicon.ico","blogs","wik.io","2388575404943858468"
"Apple to halt sales of iPhone 4S in China (Fame Dubai Blog)","SHANGHAI – Apple Inc said on Friday it will stop selling its latest iPhone in its retail stores in Beijing and Shanghai to ensure the safety of its customers and employees. Go to SourceSource : Fame Dubai BlogExplore : iPhone, iPhone 4, Phone","http://wik.io/info/US/309198933","1326439320","","","","","","","","","wikio","http://wikio.com/favicon.ico","blogs","wik.io","16209851193593872066"

Оновлення ES6 (2016)

Використовуйте цей менш щільний синтаксис, а також JSON.stringify, щоб додати лапки в рядки, зберігаючи числа без лапок:

const items = json3.items
const replacer = (key, value) => value === null ? '' : value // specify how you want to handle null values here
const header = Object.keys(items[0])
let csv = items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','))
csv.unshift(header.join(','))
csv = csv.join('\r\n')

console.log(csv)

3
Мені подобається лаконічність цього, але слід зазначити, що він не справляється з кількома речами, які дехто може вважати ідеальними. напр., кожен запис у своєму рядку, цифри та
логічні

2
Ви можете додати + "\ r \ n" після fields.map (), щоб отримати один запис на рядок. Щоб отримати числа без котирувань, ви можете замість цього використовувати JSON.stringify (рядок [fieldName]), який буде цитувати лише рядки, а числа залишатимуться без лапок.
Крістіан Ландгрен,

1
@scunliffe: Я оновив новий приклад за допомогою JSON.stringify - він повинен обробляти описані вами випадки.
Крістіан Ландгрен,

1
@marathon, Хороший улов, оновив приклад замінником для окремої обробки нульових випадків. Якщо не використовується замінник, null буде виведено як null- тепер приклади повинні правильно обробляти як null, undefined, так і числа.
Крістіан Ландгрен,

3
Варто зазначити, що це уникає рядків у лапках, використовуючи це, \"що дозволяє деяким полям "вискакувати" зі свого стовпця при перегляді в Excel (що, мабуть "", вважається кращим символом для лапок). Це можна вирішити, додавши .replace(/\\"/g, '""')до кінця, JSON.stringify(row[fieldName], replacer)як я вже зазначив у своїй відповіді вище.
user1274820

51

Добре, нарешті, цей код працює:

<html>
<head>
    <title>Demo - Covnert JSON to CSV</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script type="text/javascript" src="https://github.com/douglascrockford/JSON-js/raw/master/json2.js"></script>

    <script type="text/javascript">
        // JSON to CSV Converter
        function ConvertToCSV(objArray) {
            var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
            var str = '';

            for (var i = 0; i < array.length; i++) {
                var line = '';
                for (var index in array[i]) {
                    if (line != '') line += ','

                    line += array[i][index];
                }

                str += line + '\r\n';
            }

            return str;
        }

        // Example
        $(document).ready(function () {

            // Create Object
            var items = [
                  { name: "Item 1", color: "Green", size: "X-Large" },
                  { name: "Item 2", color: "Green", size: "X-Large" },
                  { name: "Item 3", color: "Green", size: "X-Large" }];

            // Convert Object to JSON
            var jsonObject = JSON.stringify(items);

            // Display JSON
            $('#json').text(jsonObject);

            // Convert JSON to CSV & Display CSV
            $('#csv').text(ConvertToCSV(jsonObject));
        });
    </script>
</head>
<body>
    <h1>
        JSON</h1>
    <pre id="json"></pre>
    <h1>
        CSV</h1>
    <pre id="csv"></pre>
</body>
</html>

Велике спасибі за підтримку всім учасникам.

Праней


1
Я спробував це. у мене є три колони, але в Excel все буде надходити в одній колонці
Nithesh Narayanan

1
Нітеш ви повинні вказати ',' як роздільник
Jacer Omri

Дякуємо, що поділились цим тут. Просто використовував його, і він працює ідеально.
Рамін Араббагхері

Дякую за це! Я додав наступне, щоб у рядку не було "[object Object]", якщо комірка містить об'єкт. якщо (_.isObject (масив [i] [індекс])) {масив [i] [індекс] = JSON.stringify (масив [i] [індекс]); }. (використовує підкреслення, але ви можете змінити на ванільний)
claytronicon

1
@Sunil Я знайшов, якщо значення містять коми, це ламається. Для своїх потреб я щойно зробив це: var re = new RegExp (',', 'g'); array [i] [index] = array [i] [index] .toString (). replace (re, ';')
claytronicon

17

Дуже гарне рішення від praneybehl, але якщо хтось хоче зберегти дані у вигляді csvфайлу та використовуючи blobметод, він може посилатися на це:

function JSONToCSVConvertor(JSONData, ReportTitle, ShowLabel) {     

//If JSONData is not an object then JSON.parse will parse the JSON string in an Object
var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;
var CSV = '';    
//This condition will generate the Label/Header
if (ShowLabel) {
    var row = "";

    //This loop will extract the label from 1st index of on array
    for (var index in arrData[0]) {
        //Now convert each value to string and comma-seprated
        row += index + ',';
    }
    row = row.slice(0, -1);
    //append Label row with line break
    CSV += row + '\r\n';
}

//1st loop is to extract each row
for (var i = 0; i < arrData.length; i++) {
    var row = "";
    //2nd loop will extract each column and convert it in string comma-seprated
    for (var index in arrData[i]) {
        row += '"' + arrData[i][index] + '",';
    }
    row.slice(0, row.length - 1);
    //add a line break after each row
    CSV += row + '\r\n';
}

if (CSV == '') {        
    alert("Invalid data");
    return;
}   

//this trick will generate a temp "a" tag
var link = document.createElement("a");    
link.id="lnkDwnldLnk";

//this part will append the anchor tag and remove it after automatic click
document.body.appendChild(link);

var csv = CSV;  
blob = new Blob([csv], { type: 'text/csv' }); 
var csvUrl = window.webkitURL.createObjectURL(blob);
var filename = 'UserExport.csv';
$("#lnkDwnldLnk")
.attr({
    'download': filename,
    'href': csvUrl
}); 

$('#lnkDwnldLnk')[0].click();    
document.body.removeChild(link);
}

Це рішення працює, але має деякі дивні плями - ви визначаєте його var rowдвічі (якщо оператори та для циклів не створюють закриття). Також цикл мітки / заголовка, можливо, можна зменшити до одного рядка:Object.keys(arrData[0]).join(',')
ccnokes

Ваша відповідь працює. Але для таких випадків, як, якщо якийсь стовпець недоступний для якогось рядка, він не враховуватиме відсутній стовпець і не буде вирівнювати дані стовпців для цих даних рядків.
sms

Мені вдалося змусити цей метод працювати, але мені довелося відредагувати частину коду, щоб: 1. працювати без JQuery: document.getElementById("lnkDwnldLnk").download = filename; document.getElementById("lnkDwnldLnk").href = csvUrl;2. працювати в IE11: if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, filename); } else { document.getElementById('lnkDwnldLnk').click(); }
Джейсон

17

Я просто хотів додати тут трохи коду для людей у ​​майбутньому, оскільки я намагався експортувати JSON у документ CSV та завантажити його.

Я використовую $.getJSONдля витягування даних JSON із зовнішньої сторінки, але якщо у вас є базовий масив, ви можете просто використовувати це.

Для створення CSV-даних використовується код Крістіана Ландгрена.

$(document).ready(function() {
    var JSONData = $.getJSON("GetJsonData.php", function(data) {
        var items = data;
        const replacer = (key, value) => value === null ? '' : value; // specify how you want to handle null values here
        const header = Object.keys(items[0]);
        let csv = items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','));
        csv.unshift(header.join(','));
        csv = csv.join('\r\n');

        //Download the file as CSV
        var downloadLink = document.createElement("a");
        var blob = new Blob(["\ufeff", csv]);
        var url = URL.createObjectURL(blob);
        downloadLink.href = url;
        downloadLink.download = "DataDump.csv";  //Name the file here
        document.body.appendChild(downloadLink);
        downloadLink.click();
        document.body.removeChild(downloadLink);
    });
});

Редагувати: Варто зауважити, що JSON.stringifyдодавання буде уникати лапок \". Якщо ви переглядаєте CSV у excel, це не подобається як вхідний символ.

Ви можете додати .replace(/\\"/g, '""')до кінця, JSON.stringify(row[fieldName], replacer)щоб правильно відобразити це в Excel (це замінить \"на ""те, що віддає перевагу Excel).

Повна лінія: let csv = items.map(row => header.map(fieldName => (JSON.stringify(row[fieldName], replacer).replace(/\\"/g, '""'))).join(','));


11

Якщо хтось хотів завантажити його також.
Ось неймовірна маленька функція, яка перетворить масив об’єктів JSON на CSV, а потім завантажить його.

downloadCSVFromJson = (filename, arrayOfJson) => {
  // convert JSON to CSV
  const replacer = (key, value) => value === null ? '' : value // specify how you want to handle null values here
  const header = Object.keys(arrayOfJson[0])
  let csv = arrayOfJson.map(row => header.map(fieldName => 
  JSON.stringify(row[fieldName], replacer)).join(','))
  csv.unshift(header.join(','))
  csv = csv.join('\r\n')

  // Create link and download
  var link = document.createElement('a');
  link.setAttribute('href', 'data:text/csv;charset=utf-8,%EF%BB%BF' + encodeURIComponent(csv));
  link.setAttribute('download', filename);
  link.style.visibility = 'hidden';
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
};

Тоді назвіть це так:

this.downloadCSVFromJson(`myCustomName.csv`, this.state.csvArrayOfJson)

здається, це не працює для речей, коли в одному з елементів є одна цитата, наприкладCap D'antibes
MidnightDataGeek

9

Існує безліч варіантів повторного використання існуючих потужних бібліотек, що базуються на стандартах.

Якщо ви випадково використовуєте D3 у своєму проекті, ви можете просто викликати:

    d3.csv.formatабо d3.csv.formatRowsфункції для перетворення масиву об’єктів у рядок CSV.

    d3.csv.formatRows надає вам більший контроль над тим, які властивості перетворюються на csv.

    Будь ласка, зверніться до d3.csv.format та d3.csv.formatRows wiki-сторінок.

Є також інші бібліотеки, такі як jquery-csv , PapaParse . Papa Parse не має залежностей - навіть jQuery.

Для плагінів на основі jquery перевірте це .


1
Для мене це чудово працювало. Зверніть увагу, що API D3 змінився з 2017 р. V3 (зараз це v4): github.com/d3/d3-dsv/blob/v1.2.0/README.md#csvFormat
aljabear

7

Спробуйте ці приклади

Приклад 1:

JsonArray = [{
    "AccountNumber": "123",
    "AccountName": "abc",
    "port": "All",
    "source": "sg-a78c04f8"

}, {
    "Account Number": "123",
    "Account Name": "abc",
    "port": 22,
    "source": "0.0.0.0/0",
}]

JsonFields = ["Account Number","Account Name","port","source"]

function JsonToCSV(){
    var csvStr = JsonFields.join(",") + "\n";

    JsonArray.forEach(element => {
        AccountNumber = element.AccountNumber;
        AccountName   = element.AccountName;
        port          = element.port
        source        = element.source

        csvStr += AccountNumber + ',' + AccountName + ','  + port + ',' + source + "\n";
        })
        return csvStr;
}

Приклад2:

JsonArray = [{
    "AccountNumber": "1234",
    "AccountName": "abc",
    "inbound": [{
        "port": "All",
        "source": "sg-a78c04f8"
    },
    {
        "port": 22,
        "source": "0.0.0.0/0",
    }]
}]

JsonFields = ["Account Number", "Account Name", "port", "source"]

function JsonToCSV() {
    var csvStr = JsonFields.join(",") + "\n";

    JsonArray.forEach(element => {
        AccountNumber = element.AccountNumber;
        AccountName = element.AccountName;
        
        element.inbound.forEach(inboundELe => {
            port = inboundELe.port
            source = inboundELe.source
            csvStr += AccountNumber + ',' + AccountName + ',' + port + ',' + source + "\n";
        })
    })
    return csvStr;
}

Ви навіть можете завантажити файл CSV, використовуючи такий код:

function downloadCSV(csvStr) {

    var hiddenElement = document.createElement('a');
    hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvStr);
    hiddenElement.target = '_blank';
    hiddenElement.download = 'output.csv';
    hiddenElement.click();
}

4
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>JSON to CSV</title>
    <script src="http://code.jquery.com/jquery-1.7.1.js" type="text/javascript"></script>
</head>
<body>
    <h1>This page does nothing....</h1>

    <script type="text/javascript">
        var json3 = {
          "count": 2,
          "items": [{
              "title": "Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust)",
              "description": "Advertise here with BSA Apple cancelled its scheduled sale of iPhone 4S in one of its stores in China’s capital Beijing on January 13. Crowds outside the store in the Sanlitun district were waiting on queues overnight. There were incidents of scuffle between shoppers and the store’s security staff when shoppers, hundreds of them, were told that the sales [...]Source : Design You TrustExplore : iPhone, iPhone 4, Phone",
              "link": "http://wik.io/info/US/309201303",
              "timestamp": 1326439500,
              "image": null,
              "embed": null,
              "language": null,
              "user": null,
              "user_image": null,
              "user_link": null,
              "user_id": null,
              "geo": null,
              "source": "wikio",
              "favicon": "http://wikio.com/favicon.ico",
              "type": "blogs",
              "domain": "wik.io",
              "id": "2388575404943858468"
            },
            {
              "title": "Apple to halt sales of iPhone 4S in China (Fame Dubai Blog)",
              "description": "SHANGHAI – Apple Inc said on Friday it will stop selling its latest iPhone in its retail stores in Beijing and Shanghai to ensure the safety of its customers and employees. Go to SourceSource : Fame Dubai BlogExplore : iPhone, iPhone 4, Phone",
              "link": "http://wik.io/info/US/309198933",
              "timestamp": 1326439320,
              "image": null,
              "embed": null,
              "language": null,
              "user": null,
              "user_image": null,
              "user_link": null,
              "user_id": null,
              "geo": null,
              "source": "wikio",
              "favicon": "http://wikio.com/favicon.ico",
              "type": "blogs",
              "domain": "wik.io",
              "id": "16209851193593872066"
            }
          ]
        };

        const items = json3.items
        const replacer = (key, value) => value === null ? '' : value // specify how you want to handle null values here
        const header = Object.keys(items[0])
        let csv = items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','))
        csv.unshift(header.join(','))
        csv = csv.join('\r\n')

        var link = document.createElement("a");    
        link.id="lnkDwnldLnk";
        document.body.appendChild(link);
        blob = new Blob([csv], { type: 'text/csv' }); 
        var csvUrl = window.webkitURL.createObjectURL(blob);
        var filename = 'UserExport.csv';
        jQuery("#lnkDwnldLnk")
        .attr({
            'download': filename,
            'href': csvUrl
        });
        jQuery('#lnkDwnldLnk')[0].click();
        document.body.removeChild(link);
    </script>
</body>
</html>

1

Ось спосіб зробити це для динамічно глибоких об’єктів об’єктно-орієнтованим способом для новіших версій js. можливо, вам доведеться змінити окремий тип за регіонами.

private ConvertToCSV(objArray) {
    let rows = typeof objArray !== "object" ? JSON.parse(objArray) : objArray;
    let  header = "";
    Object.keys(rows[0]).map(pr => (header += pr + ";"));

    let str = "";
    rows.forEach(row => {
        let line = "";
        let columns =
            typeof row !== "object" ? JSON.parse(row) : Object.values(row);
        columns.forEach(column => {
            if (line !== "") {
                line += ";";
            }
            if (typeof column === "object") {
                line += JSON.stringify(column);
            }  else {
                line += column;
            }
        });
        str += line + "\r\n";
    });
    return header + "\r\n" + str;
}

1

Іноді предмети мають різну довжину. Тож я зіткнувся з тією ж проблемою, що і Кайл Пеннелл. Але замість того, щоб сортувати масив, ми просто обходимо його і вибираємо найдовший. Складність часу зменшується до O (n) порівняно з O (n log (n)) при першому сортуванні.

Я почав з коду з оновленої версії ES6 (2016) Крістіана Ландгрена .

json2csv(json) {
    // you can skip this step if your input is a proper array anyways:
    const simpleArray = JSON.parse(json)
    // in array look for the object with most keys to use as header
    const header = simpleArray.map((x) => Object.keys(x))
      .reduce((acc, cur) => (acc.length > cur.length ? acc : cur), []);

    // specify how you want to handle null values here
    const replacer = (key, value) => (
      value === undefined || value === null ? '' : value);
    let csv = simpleArray.map((row) => header.map(
      (fieldName) => JSON.stringify(row[fieldName], replacer)).join(','));
    csv = [header.join(','), ...csv];
    return csv.join('\r\n');
}

1

Я хотів викривити відповідь @Christian Landgren вище. Я був збентежений, чому мій файл CSV мав лише 3 стовпці / заголовки. Це було тому, що перший елемент у моєму json мав лише 3 ключі. Тому потрібно бути обережним з const header = Object.keys(json[0])лінією. Припускається, що перший елемент масиву є репрезентативним. У мене був брудний JSON, який з деякими об'єктами має більш-менш.

Тому я додав array.sortдо цього, що впорядковує JSON за кількістю ключів. Таким чином, ваш файл CSV матиме максимальну кількість стовпців.

Це також функція, яку ви можете використовувати у своєму коді. Просто годуйте його JSON!

function convertJSONtocsv(json) {
    if (json.length === 0) {
        return;
    }

    json.sort(function(a,b){ 
       return Object.keys(b).length - Object.keys(a).length;
    });

    const replacer = (key, value) => value === null ? '' : value // specify how you want to handle null values here
    const header = Object.keys(json[0])
    let csv = json.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','))
    csv.unshift(header.join(','))
    csv = csv.join('\r\n')

    fs.writeFileSync('awesome.csv', csv)
}

1

Адаптація від відповіді praneybehl для роботи з вкладеними об'єктами та роздільником вкладок

function ConvertToCSV(objArray) {
  let array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
  if(!Array.isArray(array))
      array = [array];

  let str = '';

  for (let i = 0; i < array.length; i++) {
    let line = '';
    for (let index in array[i]) {
      if (line != '') line += ','

      const item = array[i][index];
      line += (typeof item === 'object' && item !== null ? ConvertToCSV(item) : item);
    }
    str += line + '\r\n';
  }

  do{
      str = str.replace(',','\t').replace('\t\t', '\t');
  }while(str.includes(',') || str.includes('\t\t'));

  return str.replace(/(\r\n|\n|\r)/gm, ""); //removing line breaks: https://stackoverflow.com/a/10805198/4508758
}

1
Це ідеально підходить для копіювання та вставки прямо в Excel / Таблиці! Дякую!
UP3

0

Напишіть Csv.

function writeToCsv(dataToWrite, callback) {
    var dataToWrite;
    var fs = require('fs');
    dataToWrite = convertToCSV(dataToWrite);
    fs.writeFile('assets/distanceInfo.csv', dataToWrite, 'utf8', function (err) {
      if (err) {
        console.log('Some error occured - file either not saved or corrupted file saved.');
      } else{
        console.log('It\'s saved!');
      }
      callback("data_saved | assets/distanceInfo.csv")
    });
}

function convertToCSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';
    for (var i = 0; i < array.length; i++) {
        var line = '';
        for (var index in array[i]) {
            if (line != '') line += ','

            line += array[i][index];
        }
        str += line + '\r\n';
    }
    return str;
}

2
Я не думаю, що це має велику цінність. Будь ласка, відредагуйте, щоб додати деякі пояснення того, як це допомагає відповісти на запитання.
Fedorqui 'SO prestani шкодити'

0

Тут смішно нічого повного, ні роботи (IE, ні node.js). Відповідь на подібне запитання, трохи структурований JSON (припустимо, не потрібно його копіювати знову), включаючи демонстраційний фрагмент. Перетворення JSON в CSV (JavaScript): Як правильно відформатувати перетворення CSV Сподіваюся, не тільки конвертер одного типу, а й на моєму Github (згаданий у профілі) аналогічно використовується для аналізу невідомої структури JSON. Я автор коду в цій відповіді та всього коду на моєму Github (за винятком деяких проектів, що запускаються як fork / + переклад).


0

Особисто для цього я б використовував бібліотеку d3-dsv . Чому reinvent the wheel?


import { csvFormat } from 'd3-dsv';
/**
 * Based on input data convert it to csv formatted string
 * @param (Array) columnsToBeIncluded array of column names (strings)
 *                which needs to be included in the formated csv
 * @param {Array} input array of object which need to be transformed to string
 */
export function convertDataToCSVFormatString(input, columnsToBeIncluded = []) {
  if (columnsToBeIncluded.length === 0) {
    return csvFormat(input);
  }
  return csvFormat(input, columnsToBeIncluded);
}

За допомогою тремтіння дерев ви можете просто імпортувати цю функцію з d3-dsvбібліотеки


0

Ось моя проста версія перетворення масиву об’єктів у CSV (припускаючи, що всі об’єкти мають однакові атрибути):

var csv = []
if (items.length) {
  var keys = Object.keys(items[0])
  csv.push(keys.join(','))
  items.forEach(item => {
    let vals = keys.map(key => item[key] || '')
    csv.push(vals.join(','))
  })
}

csv = csv.join('\n') 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.