JSON'u CSV formatına dönüştürme ve bir değişkende saklama


109

Tarayıcıda JSON verilerini açan bir bağlantım var, ancak maalesef nasıl okuyacağıma dair hiçbir fikrim yok. Bu verileri JavaScript kullanarak CSV biçiminde dönüştürmenin ve JavaScript dosyasına kaydetmenin bir yolu var mı?

Veriler şöyle görünür:

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

Bulabildiğim en yakın şey şuydu: JSON formatını MS Excel için CSV formatına dönüştür

Ama bir CSV dosyasında indiriyor, onu bir değişkende, tüm dönüştürülmüş veride saklıyorum.

Ayrıca kaçış karakterlerinin nasıl değiştirileceğini öğrenmek istiyor: '\u2019'normale dön.


Bu kodu denedim:

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

Ama işe yaramıyor gibi görünüyor. Birisi lütfen yardım edebilir mi?



orada iyi bir kodunuz var. indirilen satır window.open ("data: text / csv; charset = utf-8," + escape (str)) .. ihtiyacınız yoksa atlayın. ve csv dizesi bu değişkende tutulur: str
zdrsh

1
CSV, JSON gibi birden çok veriyi (aynı zamanda) işleyemez. JSON'nuzun CSV olarak nasıl görünmesini beklersiniz? 2,Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust), ...?
Stefan

Verilerimin şöyle görünmesini istiyorum: Kaos Arasında Pekin'de Apple iPhone 4S Satışı İptal Edildi (Tasarım Size Güvendiğiniz), BSA ile Reklam Verin Apple, mağazalarından birinde planlanan iPhone 4S satışını iptal etti .. ,,,,,, vb. Bu başlangıç ​​karakterlerini kolayca kaldırabilirim: "{" count ": 2," items ": [:"
praneybehl

@zdrsh evet ama bazı nedenlerden dolayı onu çalıştıramıyorum.
praneybehl

Yanıtlar:


164

Json'u csv'ye dönüştürmenin daha zarif bir yolu, harita işlevini herhangi bir çerçeve olmadan kullanmaktır:

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)

Çıktı:

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 Güncellemesi (2016)

Bu daha az yoğun sözdizimini ve ayrıca JSON.stringify'ı kullanarak sayıları tırnaksız tutarken dizelere tırnak işareti ekleyin:

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
Bunun kısa olmasını seviyorum, ancak bazılarının ideal bulabileceği birkaç şeyi ele almadığına dikkat edilmelidir. örneğin, her kayıt kendi satırında, sayılarda ve boolelerde alıntılanmamış bırakılmış, vb.
scunliffe

2
Satır başına bir kayıt almak için fields.map () 'den sonra bir + "\ r \ n" ekleyebilirsiniz. Sayıları tırnaksız almak için bunun yerine JSON.stringify (satır [alanAdı]) kullanabilirsiniz; bu, yalnızca dizeleri tırnak içine alacak ve sayıları tırnaksız bırakacaktır.
Christian Landgren

1
@scunliffe: JSON.stringify ile yeni bir örnek güncelledim - açıkladığınız vakaları ele almalı.
Christian Landgren

1
@marathon, İyi yakalama, boş vakaları ayrı ayrı ele almak için örneği değiştirici ile güncelledi. Değiştirici kullanılmazsa, boş değer olarak çıktılanacaktır null- şimdi örnekler hem null, undefined hem de sayıları doğru şekilde ele almalıdır.
Christian Landgren

5
Bunun \", Excel'de görüntülendiğinde bazı alanların sütunlarından "dışarı çıkmasına" izin veren tırnak içindeki dizelerden kaçtığını belirtmek gerekir (bu "", tırnak işaretleri için bir çıkış karakteri olarak tercih edilir). Bu, yukarıdaki cevabımda belirttiğim gibi .replace(/\\"/g, '""')sonuna eklenerek çözülebilir JSON.stringify(row[fieldName], replacer).
user1274820

54

Tamam, sonunda bu kodu çalıştırdım:

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

Katkıda bulunanlara tüm destekleriniz için çok teşekkür ederiz.

Praney


1
Bunu denedim. üç
sütunum var ama excel'de

1
Nithesh, sınırlayıcı olarak ',' belirtmelisiniz
Jacer Omri

Bunu burada paylaştığınız için teşekkürler. Sadece kullandım ve mükemmel çalışıyor.
Ramin Arabbagheri

Bunun için teşekkürler! Bir hücre bir nesne içeriyorsa satırda "[nesne Nesnesi]" olmasını önlemek için aşağıdakileri ekledim. eğer (_.isObject (dizi [i] [dizin])) {dizi [i] [dizin] = JSON.stringify (dizi [i] [dizin]); }. (alt çizgi kullanır, ancak vanilyaya
geçebilirsiniz

1
@Sunil Değerler virgül içeriyorsa, kesiliyor. İhtiyaçlarım için şunu yaptım: var re = new RegExp (',', 'g'); array [i] [index] = array [i] [index] .toString (). replace (re, ';')
claytronicon

18

Praneybehl tarafından çok güzel bir çözüm, ancak birisi verileri bir csvdosya olarak kaydetmek ve bir blobyöntem kullanmak isterse, şuna başvurabilir:

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

Bu çözüm işe yarıyor ancak bazı garip noktaları var - var rowiki kez tanımlıyorsunuz (eğer ifadeler ve döngüler kapanış oluşturmuyorsa). Ayrıca etiket / başlık döngüsü muhtemelen bir satıra indirgenebilir:Object.keys(arrData[0]).join(',')
ccnokes

Cevabınız işe yarıyor. Ancak bazı sütunların bazı satırlar için mevcut olmaması gibi durumlarda, eksik sütunu dikkate almaz ve bu satır verileri için sütun verilerini yeniden hizalamaz.
sms

Bu yöntemi çalıştırmayı başardım, ancak kodun bir kısmını şu şekilde düzenlemek zorunda kaldım: 1. JQuery olmadan çalışmak: document.getElementById("lnkDwnldLnk").download = filename; document.getElementById("lnkDwnldLnk").href = csvUrl;2. IE11'de çalışmak: if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, filename); } else { document.getElementById('lnkDwnldLnk').click(); }
Jason

17

JSON'u bir CSV belgesine aktarmaya ve indirmeye çalıştığım için gelecekte insanlar için buraya bazı kodlar eklemek istedim.

$.getJSONJson verilerini harici bir sayfadan çekmek için kullanıyorum , ancak temel bir diziniz varsa, bunu kullanabilirsiniz.

Bu, csv verilerini oluşturmak için Christian Landgren'in kodunu kullanır.

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

Düzenleme: JSON.stringifyEkleyerek tırnak içindeki alıntılardan kaçacağını belirtmekte fayda var\" . CSV'yi excel'de görüntülerseniz, bunu bir çıkış karakteri olarak beğenmezsiniz.

Ekleyebilir .replace(/\\"/g, '""')sonuna JSON.stringify(row[fieldName], replacer)(bu yerini alacak excel bu düzgün görüntülemek için \"birlikte ""hangi excel tercih budur).

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


12

Biri de indirmek isterse.
İşte bir dizi JSON nesnesini csv'ye dönüştürecek ve sonra indirecek harika bir küçük işlev.

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

Öyleyse şöyle deyin:

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

Bu, öğelerden birinde tek bir alıntı olduğunda işe yaramıyor gibi görünüyor, örneğinCap D'antibes
MidnightDataGeek

10

Standartlara dayalı mevcut güçlü kitaplıkları yeniden kullanmak için birden fazla seçenek vardır.

Projenizde D3 kullanırsanız, basitçe şunları çağırabilirsiniz:

    d3.csv.formatveya d3.csv.formatRowsbir dizi nesneyi csv dizesine dönüştürmek için işlevler.

    d3.csv.formatRows size hangi özelliklerin csv'ye dönüştürüleceği konusunda daha fazla kontrol sağlar.

    Lütfen d3.csv.format ve d3.csv.formatRows'a bakın wiki sayfalarına bakın.

Jquery-csv , PapaParse gibi başka kütüphaneler de mevcuttur . Papa Parse'ın bağımlılıkları yoktur - jQuery bile.

Jquery tabanlı eklentiler için lütfen bunu kontrol edin .


1
Bu benim için harika çalıştı. D3 API'nin 2017.v3'ten beri değiştiğini unutmayın (şu anda v4'tür
aljabear

Teşekkürler! PapaParse's Papa.unparse (data) ( papaparse.com/docs#json-to-csv ) kullandım. Sorunlarıma hızlı çözüm!
Daniel Valenzuela

8

Bu Örnekleri Deneyin

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

Örnek2:

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

Aşağıdaki kodu kullanarak csv dosyasını bile indirebilirsiniz:

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>

2

İç içe nesneler ve sekme ayırıcı ile çalışmak için praneybehl yanıtından bir uyarlama

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
Bu, kopyalayıp doğrudan Excel / E-Tablolar'a yapıştırmak için mükemmeldir! Teşekkürler!
UP3

1

Bu, dinamik olarak derin nesneler için daha yeni js sürümleri için nesne yönelimli bir şekilde yapmanın bir yolu. Bölgeden sonra ayırıcı tipini değiştirmeniz gerekebilir.

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

Bazen nesnelerin farklı uzunlukları vardır. Ben de Kyle Pennell ile aynı problemle karşılaştım. Ancak diziyi sıralamak yerine, basitçe üzerinden geçer ve en uzun olanı seçeriz. İlk sıralama yapılırken O (n log (n)) ile karşılaştırıldığında zaman karmaşıklığı O (n) 'ye düşürülür.

Christian Landgren'in güncellenmiş ES6 (2016) sürümündeki kodla başladım .

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'in yukarıdaki cevabından bahsetmek istedim. CSV dosyamın neden yalnızca 3 sütun / başlık içerdiği konusunda kafam karışmıştı. Bunun nedeni, json'umdaki ilk öğenin yalnızca 3 anahtarı olmasıydı. Bu yüzden const header = Object.keys(json[0])çizgiye dikkat etmelisin . Dizideki ilk öğenin temsili olduğu varsayılır. Bazı nesnelerin az veya çok olduğu dağınık JSON'um vardı.

Bu yüzden buna array.sortJSON'u anahtar sayısına göre sipariş edecek bir ekledim . Böylece, CSV dosyanız maksimum sayıda sütuna sahip olacaktır.

Bu aynı zamanda kodunuzda kullanabileceğiniz bir işlevdir. Sadece JSON ile besle!

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

İşte bir dizi nesneyi CSV'ye dönüştürmenin basit versiyonu (bu nesnelerin hepsinin aynı nitelikleri paylaştığını varsayarak):

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

0

Csv yazın.

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
Bunun pek bir değeri olduğunu sanmıyorum. Lütfen bunun soruyu yanıtlamaya nasıl yardımcı olduğuna dair bazı açıklamalar eklemek için düzenleyin .
fedorqui,

0

Komik hiçbir şey burada tamamlanmadı ve burada çalışmıyor (IE veya node.js). Benzer bir soruya cevap, biraz yapılandırılmış JSON (tekrar kopyalamaya gerek olmadığını varsayalım), ayrıca demo pasajı da dahil. JSON'dan CSV'ye dönüştürme (JavaScript): CSV dönüşümü nasıl doğru bir şekilde biçimlendirilir Umarım sadece tek tip dönüştürücü değil, benim Github'ımda (profilde bahsedilmiştir) bilinmeyen JSON yapısını analiz etmek için kullanılan benzerdir. Bu cevabın ve Github'ımdaki tüm kodların yazarıyım (fork / + çeviri olarak başlayan bazı projeler hariç).


0

Şahsen bunu yapmak için d3-dsv kütüphanesini kullanırdım. Neden 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);
}

Ağaç sallama ile bu belirli işlevi d3-dsvkitaplıktan içe aktarabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.