Come convertire JSON in formato CSV e archiviarlo in una variabile


99

Ho un collegamento che apre i dati JSON nel browser, ma sfortunatamente non ho la più pallida idea di come leggerlo. C'è un modo per convertire questi dati utilizzando JavaScript in formato CSV e salvarli in un file JavaScript?

I dati hanno questo aspetto:

{
  "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"
  }]
}

Il più vicino che ho trovato è stato: Converti il ​​formato JSON in formato CSV per MS Excel

Ma si scarica in un file CSV, lo memorizzo in una variabile, tutti i dati convertiti.

Inoltre vorrei sapere come cambiare i caratteri di escape: '\u2019'torna alla normalità.


Ho provato questo codice:

<!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>

Ma non sembra funzionare. Qualcuno può aiutarmi per favore?



hai un buon codice lì. la riga che scarica è window.open ("data: text / csv; charset = utf-8," + escape (str)) .. saltala se non ne hai bisogno. e la stringa csv è mantenuta in questa variabile: str
zdrsh

CSV non può gestire più livelli di dati (anche) come JSON. Come ti aspetti che il tuo JSON appaia come CSV? 2,Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust), ...?
Stefan

Vorrei che i miei dati fossero simili a: Vendita di iPhone 4S di Apple annullata a Pechino in mezzo al caos (Design You Trust), Pubblicità qui con BSA Apple ha annullato la vendita programmata di iPhone 4S in uno dei suoi negozi .. ,,,,,, ecc. Posso rimuovere facilmente questi caratteri iniziali: "{" count ": 2," items ": [:"
praneybehl

@zdrsh sì, ma per qualche motivo non sono in grado di farlo funzionare.
praneybehl

Risposte:


154

Un modo più elegante per convertire json in csv è usare la funzione map senza alcun framework:

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)

Produzione:

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"

Aggiorna ES6 (2016)

Usa questa sintassi meno densa e anche JSON.stringify per aggiungere virgolette alle stringhe mantenendo i numeri non quotati:

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
Mi piace la concisione di questo, ma va notato che non gestisce alcune cose che alcuni potrebbero trovare ideali. ad esempio, ogni record sulla propria riga, numeri e booleani non
quotati

2
Puoi aggiungere un + "\ r \ n" dopo fields.map () per ottenere un record per riga. Per ottenere numeri non quotati puoi utilizzare JSON.stringify (riga [fieldName]) invece che citerà solo stringhe e lascerà i numeri non quotati.
Christian Landgren

1
@scunliffe: ho aggiornato un nuovo esempio con JSON.stringify - dovrebbe gestire i casi che hai descritto.
Christian Landgren

1
@marathon, Good catch, ha aggiornato l'esempio con un sostituto per gestire separatamente i casi nulli. Se non viene utilizzato alcun sostituto, null verrà emesso come null- ora gli esempi dovrebbero gestire correttamente sia null, undefined che numeri.
Christian Landgren

3
Vale la pena notare che questo sfugge alle stringhe tra virgolette usando \"che consente ad alcuni campi di "apparire" dalla loro colonna quando vengono visualizzati in Excel (che sembra preferire ""come carattere di escape per le virgolette). Questo può essere risolto aggiungendo .replace(/\\"/g, '""')alla fine di JSON.stringify(row[fieldName], replacer)come ho notato nella mia risposta sopra.
user1274820

51

Ok finalmente ho questo codice funzionante:

<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>

Grazie mille per tutto il supporto a tutti i contributori.

Praney


1
Ho provato questo. ho tre colonne ma in Excel tutte le cose arriveranno in una sola colonna
Nithesh Narayanan

1
Nithesh dovresti specificare "," come delimitatore
Jacer Omri

Grazie per aver condiviso questo qui. L'ho appena usato e funziona perfettamente.
Ramin Arabbagheri

Grazie per questo! Ho aggiunto quanto segue per evitare di avere "[Object Object]" nella riga se una cella contiene un oggetto. if (_.isObject (array [i] [index])) {array [i] [index] = JSON.stringify (array [i] [index]); }. (usa il carattere di sottolineatura, ma puoi cambiare in vaniglia)
claytronicon

1
@Sunil ho scoperto che se i valori contengono virgole, si rompe. Per le mie esigenze ho appena fatto questo: var re = new RegExp (',', 'g'); array [i] [index] = array [i] [index] .toString (). replace (re, ';')
claytronicon

17

Soluzione molto bella di praneybehl, ma se qualcuno vuole salvare i dati come csvfile e utilizzando un blobmetodo, può fare riferimento a questo:

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);
}

Questa soluzione funziona ma ha alcuni punti strani: si definisce var rowdue volte (le istruzioni if ​​e i cicli for non creano chiusure). Anche il ciclo etichetta / intestazione potrebbe probabilmente essere ridotto a una riga:Object.keys(arrData[0]).join(',')
ccnokes

La tua risposta sta funzionando. Ma per casi come se una colonna non fosse disponibile per qualche riga, non considererà la colonna mancante e non riallinea i dati della colonna per quella riga.
sms

Sono riuscito a far funzionare questo metodo ma ho dovuto modificare parte del codice per: 1. lavorare senza JQuery: document.getElementById("lnkDwnldLnk").download = filename; document.getElementById("lnkDwnldLnk").href = csvUrl;2. lavorare in IE11: if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, filename); } else { document.getElementById('lnkDwnldLnk').click(); }
Jason

17

Volevo solo aggiungere del codice qui per le persone in futuro poiché stavo cercando di esportare JSON in un documento CSV e scaricarlo.

Uso $.getJSONper estrarre i dati JSON da una pagina esterna, ma se hai un array di base, puoi semplicemente usarlo.

Questo utilizza il codice di Christian Landgren per creare i dati 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);
    });
});

Modifica: vale la pena notare che JSON.stringifyaggiungerà le virgolette tra virgolette \". Se visualizzi il CSV in Excel, non gli piace come un carattere di escape.

Puoi aggiungere .replace(/\\"/g, '""')alla fine di JSON.stringify(row[fieldName], replacer)per visualizzarlo correttamente in Excel (questo sostituirà \"con ""quale è ciò che Excel preferisce).

Linea completa: let csv = items.map(row => header.map(fieldName => (JSON.stringify(row[fieldName], replacer).replace(/\\"/g, '""'))).join(','));


11

Se qualcuno volesse scaricarlo anche lui.
Ecco una piccola funzione fantastica che convertirà un array di oggetti JSON in csv, quindi lo scaricherà.

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);
};

Quindi chiamalo in questo modo:

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

questo non sembra funzionare per le cose quando c'è una singola citazione in uno degli elementi, ad esempioCap D'antibes
MidnightDataGeek,

9

Sono disponibili più opzioni per riutilizzare le potenti librerie esistenti basate su standard.

Se ti capita di utilizzare D3 nel tuo progetto, puoi semplicemente invocare:

    d3.csv.formato d3.csv.formatRowsfunzioni per convertire un array di oggetti in una stringa csv.

    d3.csv.formatRows ti dà un maggiore controllo su quali proprietà vengono convertite in csv.

    Fare riferimento alle pagine wiki d3.csv.format e d3.csv.formatRows .

Sono disponibili anche altre librerie come jquery-csv , PapaParse . Papa Parse non ha dipendenze, nemmeno jQuery.

Per i plugin basati su jquery, controlla questo .


1
Questo ha funzionato benissimo per me. Nota che l'API D3 è cambiata dal 2017.v3 (è attualmente v4): github.com/d3/d3-dsv/blob/v1.2.0/README.md#csvFormat
aljabear

7

Prova questi esempi

Esempio 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;
}

Esempio2:

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;
}

Puoi anche scaricare il file csv utilizzando il codice seguente:

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

Ecco un modo per farlo per oggetti dinamicamente profondi in un modo orientato agli oggetti per le versioni js più recenti. potrebbe essere necessario modificare il tipo separato dopo la regione.

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

A volte gli oggetti hanno lunghezze diverse. Quindi mi sono imbattuto nello stesso problema di Kyle Pennell. Ma invece di ordinare l'array, lo attraversiamo semplicemente e scegliamo il più lungo. La complessità temporale è ridotta a O (n), rispetto a O (n log (n)) quando si ordina per primo.

Ho iniziato con il codice della versione ES6 (2016) aggiornata di Christian Landgren .

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

Volevo ignorare la risposta di @Christian Landgren sopra. Ero confuso perché il mio file CSV aveva solo 3 colonne / intestazioni. Questo perché il primo elemento nel mio json aveva solo 3 chiavi. Quindi devi stare attento con la const header = Object.keys(json[0])linea. Si presume che il primo elemento dell'array sia rappresentativo. Ho avuto un JSON disordinato con alcuni oggetti che hanno più o meno.

Quindi ho aggiunto un array.sorta questo che ordinerà il JSON in base al numero di chiavi. In questo modo il tuo file CSV avrà il numero massimo di colonne.

Questa è anche una funzione che puoi usare nel tuo codice. Basta dargli da mangiare 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

Un adattamento della risposta di praneybehl per lavorare con oggetti nidificati e separatore di tabulazioni

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
Funziona perfettamente per copiare e incollare direttamente in Excel / Fogli! Grazie!
UP3

0

Scrivi 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
Non penso che abbia molto valore. Si prega di modificare per aggiungere alcune spiegazioni su come questo sta aiutando a rispondere alla domanda.
fedorqui 'SO smettila di nuocere'

0

Divertente niente di completo né funzionante qui (IE né node.js). Rispondi a una domanda simile, un JSON un po 'strutturato (supponiamo che non sia necessario copiarlo di nuovo), incluso anche lo snippet demo. Conversione da JSON a CSV (JavaScript): come formattare correttamente la conversione CSV Spero che non solo il convertitore di tipo singolo, anche sul mio Github (menzionato nel profilo) sia usato in modo simile per analizzare la struttura JSON sconosciuta. Sono l'autore del codice in questa risposta e di tutto il codice sul mio Github (tranne alcuni progetti iniziati come fork / + traduzione).


0

Personalmente userei la libreria d3-dsv per farlo. Perché 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);
}

Con lo scuotimento degli alberi puoi semplicemente importare quella particolare funzione dalla d3-dsvlibreria


0

Ecco la mia versione semplice della conversione di un array di oggetti in CSV (assumendo che quegli oggetti condividano tutti gli stessi attributi):

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') 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.