Comment convertir JSON au format CSV et stocker dans une variable

99

J'ai un lien qui ouvre les données JSON dans le navigateur, mais malheureusement je n'ai aucune idée de comment le lire. Existe-t-il un moyen de convertir ces données à l'aide de JavaScript au format CSV et de les enregistrer dans un fichier JavaScript?

Les données ressemblent à:

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

Le plus proche que j'ai pu trouver était: Convertir le format JSON au format CSV pour MS Excel

Mais il télécharge dans un fichier CSV, je le stocke dans une variable, l'ensemble des données converties.

J'aimerais également savoir comment changer les caractères d'échappement: '\u2019'retour à la normale.


J'ai essayé ce code:

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

Mais cela ne semble pas fonctionner. Puis-je avoir une aide s'il vous plait?

Praneybehl
la source
Qu'en est-il de zachhunter.com/2011/06/json-to-csv ?
ldiqual
vous avez un bon code là-bas. la ligne qui télécharge est window.open ("data: text / csv; charset = utf-8," + escape (str)) .. sautez-la si vous n'en avez pas besoin. et la chaîne csv est conservée dans cette variable: str
zdrsh
CSV ne peut pas gérer plusieurs niveaux de données (aussi bien) que JSON. À quoi vous attendriez-vous que votre JSON ressemble au format CSV? 2,Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust), ...?
Stefan
Je voudrais que mes données ressemblent à: Apple iPhone 4S Vente annulée à Pékin au milieu du chaos (Design You Trust), Annoncez ici avec BSA Apple a annulé sa vente prévue d'iPhone 4S dans l'un de ses magasins .. ,,,,,, etc. Je peux facilement supprimer ces caractères de départ: "{" count ": 2," items ": [:"
praneybehl
@zdrsh oui mais pour une raison quelconque, je ne suis pas en mesure de le faire fonctionner.
praneybehl

Réponses:

154

Un moyen plus élégant de convertir json en csv est d'utiliser la fonction map sans aucun 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)

Production:

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"

Mise à jour ES6 (2016)

Utilisez cette syntaxe moins dense ainsi que JSON.stringify pour ajouter des guillemets aux chaînes tout en gardant les nombres sans guillemets:

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)
Christian Landgren
la source
3
J'aime le caractère laconique de cela, mais il convient de noter que cela ne gère pas certaines choses que certains pourraient trouver idéales. par exemple, chaque enregistrement sur sa propre ligne, les nombres et les booléens laissés sans guillemets, etc.
scunliffe
2
Vous pouvez ajouter un + "\ r \ n" après le fields.map () pour obtenir un enregistrement par ligne. Pour obtenir des nombres sans guillemets, vous pouvez utiliser JSON.stringify (ligne [fieldName]) à la place, qui ne citera que des chaînes et laissera les nombres sans guillemets.
Christian Landgren
1
@scunliffe: J'ai mis à jour un nouvel exemple avec JSON.stringify - il devrait gérer les cas que vous avez décrits.
Christian Landgren
1
@marathon, Good catch, a mis à jour l'exemple avec un remplaçant pour gérer les cas nuls séparément. Si aucun remplaçant n'est utilisé, nul sera affiché comme null- maintenant, les exemples doivent gérer à la fois les valeurs nulles, non définies et les nombres correctement.
Christian Landgren
3
Il convient de noter que cela échappe les chaînes entre guillemets en utilisant \"ce qui permet à certains champs de "sortir" de leur colonne lorsqu'ils sont affichés dans Excel (ce qui semble préférer ""comme caractère d'échappement pour les guillemets). Cela peut être résolu en ajoutant .replace(/\\"/g, '""')à la fin de JSON.stringify(row[fieldName], replacer)comme je l'ai noté dans ma réponse ci-dessus.
user1274820
51

Ok, j'ai enfin fait fonctionner ce code:

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

Merci beaucoup pour tout le soutien à tous les contributeurs.

Praney

Praneybehl
la source
1
J'ai essayé ça. J'ai trois colonnes, mais dans Excel, tout arrivera dans une seule colonne
Nithesh Narayanan
1
Nithesh vous devez spécifier ',' comme délimiteur
Jacer Omri
Merci de partager ceci ici. Je viens de l'utiliser et cela fonctionne parfaitement.
Ramin Arabbagheri
Merci pour cela! J'ai ajouté ce qui suit pour éviter d'avoir "[objet objet]" dans la ligne si une cellule contient un objet. if (_.isObject (tableau [i] [index])) {tableau [i] [index] = JSON.stringify (tableau [i] [index]); }. (utilise un trait de soulignement, mais vous pouvez passer à la vanille)
claytronicon
1
@Sunil J'ai trouvé que si les valeurs contiennent des virgules, ça casse. Pour mes besoins, je viens de faire ceci: var re = new RegExp (',', 'g'); array [i] [index] = array [i] [index] .toString (). replace (re, ';')
claytronicon
17

Très belle solution de praneybehl, mais si quelqu'un veut enregistrer les données sous forme de csvfichier et en utilisant une blobméthode, il peut se référer à ceci:

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);
}
Samuel Joy
la source
Cette solution fonctionne mais a quelques points étranges - vous définissez var rowdeux fois (si les instructions et les boucles for ne créent pas de fermetures). De plus, la boucle d'étiquette / d'en-tête pourrait probablement être réduite à une ligne:Object.keys(arrData[0]).join(',')
ccnokes
Votre réponse fonctionne. Mais pour des cas comme si une colonne n'est pas disponible pour une ligne, il ne considérera pas la colonne manquante et ne réalignera pas les données de colonne pour ces données de ligne.
sms
J'ai pu faire fonctionner cette méthode mais j'ai dû modifier une partie du code pour: 1. travailler sans JQuery: document.getElementById("lnkDwnldLnk").download = filename; document.getElementById("lnkDwnldLnk").href = csvUrl;2. travailler dans IE11: if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, filename); } else { document.getElementById('lnkDwnldLnk').click(); }
Jason
17

Je voulais juste ajouter du code ici pour les gens à l'avenir, car j'essayais d'exporter JSON vers un document CSV et de le télécharger.

J'utilise $.getJSONpour extraire des données json d'une page externe, mais si vous avez un tableau de base, vous pouvez simplement l'utiliser.

Cela utilise le code de Christian Landgren pour créer les données 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);
    });
});

Edit: Il convient de noter que JSON.stringifyles guillemets échappent aux guillemets en ajoutant \". Si vous affichez le CSV dans Excel, il n'aime pas cela comme un caractère d'échappement.

Vous pouvez ajouter .replace(/\\"/g, '""')à la fin de JSON.stringify(row[fieldName], replacer)pour l'afficher correctement dans Excel (cela remplacera \"par ""quel est ce que Excel préfère).

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

user1274820
la source
11

Si quelqu'un voulait aussi le télécharger.
Voici une petite fonction géniale qui convertira un tableau d'objets JSON en csv, puis le téléchargera.

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

Alors appelez-le comme ceci:

this.downloadCSVFromJson(`myCustomName.csv`, this.state.csvArrayOfJson)
waz
la source
cela ne semble pas fonctionner pour les choses quand il y a un guillemet simple dans l'un des éléments, par exempleCap D'antibes
MidnightDataGeek
9

Plusieurs options sont disponibles pour réutiliser les puissantes bibliothèques existantes basées sur des normes.

Si vous utilisez D3 dans votre projet, vous pouvez simplement appeler:

    d3.csv.formatou des d3.csv.formatRowsfonctions pour convertir un tableau d'objets en chaîne csv.

    d3.csv.formatRows vous donne un meilleur contrôle sur les propriétés converties en csv.

    Veuillez vous référer aux pages wiki d3.csv.format et d3.csv.formatRows .

Il existe également d'autres bibliothèques disponibles comme jquery-csv , PapaParse . Papa Parse n'a pas de dépendances - pas même jQuery.

Pour les plugins basés sur jquery, veuillez vérifier ceci .

nagu
la source
1
Cela a très bien fonctionné pour moi. Notez que l'API D3 a changé depuis 2017.v3 (il s'agit actuellement de la v4): github.com/d3/d3-dsv/blob/v1.2.0/README.md#csvFormat
aljabear le
7

Essayez ces exemples

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

Exemple2:

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

Vous pouvez même télécharger le fichier csv en utilisant le code suivant:

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();
}
YouBee
la source
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>
agravat.in
la source
1

Voici un moyen de le faire pour les objets dynamiquement profonds d'une manière orientée objet pour les versions plus récentes de js. vous devrez peut-être changer le type de séparateur après la région.

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;
}
Nicola Munz slimxshady
la source
1

Parfois, les objets ont des longueurs différentes. J'ai donc rencontré le même problème que Kyle Pennell. Mais au lieu de trier le tableau, nous le parcourons simplement et choisissons le plus long. La complexité temporelle est réduite à O (n), par rapport à O (n log (n)) lors du tri en premier.

J'ai commencé avec le code de la version mise à jour ES6 (2016) de 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');
}
ctholho
la source
1

Je voulais riffer la réponse de @Christian Landgren ci-dessus. J'étais confus pourquoi mon fichier CSV n'avait que 3 colonnes / en-têtes. C'était parce que le premier élément de mon json n'avait que 3 clés. Vous devez donc faire attention à la const header = Object.keys(json[0])ligne. Il suppose que le premier élément du tableau est représentatif. J'avais JSON désordonné avec certains objets ayant plus ou moins.

J'ai donc ajouté un array.sortà cela qui ordonnera le JSON par nombre de clés. Ainsi, votre fichier CSV aura le nombre maximum de colonnes.

C'est également une fonction que vous pouvez utiliser dans votre code. Nourrissez-le simplement 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)
}
Kyle Pennell
la source
1

Une adaptation de praneybehl answer pour travailler avec des objets imbriqués et un séparateur de tabulation

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
}
DigaoParceiro
la source
1
Cela fonctionne parfaitement pour copier et coller directement dans Excel / Sheets! Merci!
UP3
0

Écrivez 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;
}
Ashish Gupta
la source
2
Je ne pense pas que cela ait beaucoup de valeur. Veuillez modifier pour ajouter des explications sur la façon dont cela aide à répondre à la question.
fedorqui 'SO arrêtez de nuire'
0

Drôle rien de complet ni de travail ici (IE ni node.js). Réponse à une question similaire, un JSON un peu structuré (supposons qu'il ne soit pas nécessaire de le copier à nouveau), également un extrait de démonstration inclus. Conversion JSON en CSV (JavaScript): Comment formater correctement la conversion CSV Espérons que non seulement un convertisseur de type unique, également sur mon Github (mentionné dans le profil) est similaire utilisé pour analyser la structure JSON inconnue. Je suis l'auteur du code dans cette réponse et de tout le code sur mon Github (sauf certains projets démarrés en tant que fork / + translation).

À M
la source
0

Personnellement, j'utiliserais la bibliothèque d3-dsv pour ce faire. Pourquoi 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);
}

Avec l' arborescence, vous pouvez simplement importer cette fonction particulière de la d3-dsvbibliothèque

Anuj
la source
0

Voici ma version simple de la conversion d'un tableau d'objets en CSV (en supposant que ces objets partagent tous les mêmes attributs):

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') 
Nimrod
la source