JSON을 CSV 형식으로 변환하고 변수에 저장하는 방법


99

브라우저에서 JSON 데이터를 여는 링크가 있지만 안타깝게도 읽는 방법에 대한 단서가 없습니다. 이 데이터를 CSV 형식의 JavaScript를 사용하여 변환하고 JavaScript 파일에 저장하는 방법이 있습니까?

데이터는 다음과 같습니다.

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

내가 찾을 수있는 가장 가까운 것은 : JSON 형식을 MS Excel 용 CSV 형식으로 변환하는 것입니다 .

하지만 CSV 파일로 다운로드하고, 변환 된 전체 데이터를 변수에 저장합니다.

또한 이스케이프 문자를 변경하는 방법을 알고 싶습니다 : '\u2019'다시 정상으로.


이 코드를 시도했습니다.

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

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

    DownloadJSON2CSV(json3.items);

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

      var str = '';

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

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

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

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

</head>

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

</html>

그러나 작동하지 않는 것 같습니다. 누군가 도와 주시겠습니까?



거기에 좋은 코드가 있습니다. 다운로드 할 줄은 window.open ( "data : text / csv; charset = utf-8,"+ escape (str)) .. 필요하지 않으면 건너 뛰십시오. 그리고 CSV 문자열이 변수에 저장됩니다 : STR
zdrsh

CSV는 JSON뿐만 아니라 여러 수준의 데이터를 처리 할 수 ​​없습니다. JSON이 CSV처럼 보일 것으로 예상하십니까? 2,Apple iPhone 4S Sale Cancelled in Beijing Amid Chaos (Design You Trust), ...?
Stefan

내 데이터를 다음과 같이 표시하고 싶습니다 : Apple iPhone 4S 판매가 베이징에서 취소됨 (Design You Trust), BSA로 여기에 광고하기 Apple은 매장 중 하나에서 예정된 iPhone 4S 판매를 취소했습니다. ,,,, 등 나는 쉽게 시작하는 문자를 제거 할 수 있습니다 : "{"계산 ": 2"항목을 ": ["
praneybehl

@zdrsh 예, 그러나 어떤 이유로 나는 그것을 작동시킬 수 없습니다.
praneybehl

답변:


154

json을 csv로 변환하는 더 우아한 방법은 프레임 워크없이 map 함수를 사용하는 것입니다.

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

산출:

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

ES6 업데이트 (2016)

이 덜 조밀 한 구문과 JSON.stringify를 사용하여 숫자를 따옴표없이 유지하면서 문자열에 따옴표를 추가합니다.

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

console.log(csv)

3
나는 이것의 간결함을 좋아하지만, 어떤 사람들이 이상하다고 생각할 수있는 몇 가지 일을 처리하지 않는다는 점에 유의해야합니다. 예를 들어, 자체 줄에있는 각 레코드, 인용되지 않은 숫자 및 부울 등
scunliffe

2
fields.map () 뒤에 + "\ r \ n"을 추가하여 행당 하나의 레코드를 얻을 수 있습니다. 인용되지 않은 숫자를 얻으려면 문자열 만 인용하고 숫자는 인용하지 않는 JSON.stringify (row [fieldName]) 대신 사용할 수 있습니다.
Christian Landgren 2015

1
@scunliffe : JSON.stringify로 새 예제를 업데이트했습니다. 설명하신 사례를 처리해야합니다.
Christian Landgren

1
@marathon, Good catch는 null 사례를 개별적으로 처리하기 위해 대체 자로 예제를 업데이트했습니다. 대체자를 사용하지 않으면 null이 다음과 같이 출력됩니다 null. 이제 예제는 null, undefined 및 숫자를 모두 올바르게 처리해야합니다.
Christian Landgren 2016 년

3
\"Excel에서 볼 때 일부 필드가 열에서 "팝 아웃"되도록하는 따옴표로 묶인 문자열을 이스케이프한다는 점은 주목할 가치가 있습니다 ( ""따옴표의 이스케이프 문자 로 선호 됨). 이것은 위의 대답에서 언급했듯이 .replace(/\\"/g, '""')끝에 추가 하여 해결할 수 있습니다 JSON.stringify(row[fieldName], replacer).
user1274820

51

좋아 마침내이 코드가 작동했습니다.

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

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

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

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

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

            return str;
        }

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

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

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

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

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

모든 기여자에게 모든 지원에 감사드립니다.

Praney


1
나는 이것을 시도했다. 나는 세 개의 열을 가지고 있지만 Excel에서 모든 것이 하나의 컬럼에 올 것
Nithesh 나라 야난

1
구분 기호로 ','당신은 지정해야 Nithesh
Jacer 오므리에게

여기에 공유해 주셔서 감사합니다. 그냥 사용하고 완벽하게 작동합니다.
Ramin Arabbagheri

감사합니다! 셀에 개체가 포함 된 경우 줄에 "[개체 개체]"가 표시되지 않도록 다음을 추가했습니다. if (_.isObject (array [i] [index])) {array [i] [index] = JSON.stringify (array [i] [index]); }. (밑줄을 사용하지만 바닐라로 변경할 수 있음)
claytronicon dec.

1
@Sunil 값에 쉼표가 포함되어 있으면 깨집니다. 내 필요에 따라 다음과 같이했습니다. var re = new RegExp ( ',', 'g'); array [i] [index] = array [i] [index] .toString (). replace (re, ';')
claytronicon

17

praneybehl의 매우 좋은 솔루션이지만 누군가 데이터를 csv파일 로 저장하고 blob메서드를 사용하려면 다음을 참조 할 수 있습니다.

function JSONToCSVConvertor(JSONData, ReportTitle, ShowLabel) {     

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

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

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

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

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

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

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

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

이 솔루션은 작동하지만 이상한 점이 있습니다. var row두 번 정의합니다 (if 문과 for 루프가 클로저를 생성하지 않음). 또한 레이블 / 헤더 루프는 아마도 한 줄로 줄어들 수 있습니다.Object.keys(arrData[0]).join(',')
ccnokes

당신의 대답은 효과가 있습니다. 그러나 일부 열을 일부 행에 사용할 수없는 경우 누락 된 열을 고려하지 않고 해당 행 데이터의 열 데이터를 다시 정렬하지 않습니다.
sms

이 방법을 사용할 수 있었지만 코드 일부를 다음과 같이 편집해야했습니다. 1. JQuery없이 작업 : document.getElementById("lnkDwnldLnk").download = filename; document.getElementById("lnkDwnldLnk").href = csvUrl;2. IE11에서 작업 : if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveOrOpenBlob(blob, filename); } else { document.getElementById('lnkDwnldLnk').click(); }
Jason

17

JSON을 CSV 문서로 내보내고 다운로드하려고했기 때문에 앞으로 사람들을 위해 여기에 코드를 추가하고 싶었습니다.

나는 $.getJSON외부 페이지에서 json 데이터를 가져 오는 데 사용 하지만 기본 배열이 있으면 사용할 수 있습니다.

이것은 Christian Landgren의 코드를 사용하여 csv 데이터를 생성합니다.

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

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

편집 : JSON.stringify를 추가하여 따옴표로 묶인 따옴표를 피할 수 있다는 점에 주목할 가치가 \"있습니다. Excel에서 CSV를 보면 이스케이프 문자로 좋아하지 않습니다.

당신은 추가 할 수 .replace(/\\"/g, '""')의 끝 JSON.stringify(row[fieldName], replacer)(이 교체 할 엑셀이 제대로 표시하기 \"""하는 엑셀 선호 것입니다).

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


11

누구든지 그것을 다운로드하고 싶었다면.
다음은 JSON 객체 배열을 csv로 변환 한 다음 다운로드하는 멋진 함수입니다.

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

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

그런 다음 다음과 같이 호출하십시오.

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

요소 중 하나에 작은 따옴표가있을 때 작동하지 않는 것 같습니다. 예Cap D'antibes
MidnightDataGeek

9

표준 기반의 기존 강력한 라이브러리를 재사용 할 수있는 여러 옵션이 있습니다.

프로젝트에서 D3를 사용하는 경우 다음을 간단히 호출 할 수 있습니다.

    d3.csv.format또는 d3.csv.formatRows객체 배열을 csv 문자열로 변환하는 함수.

    d3.csv.formatRows csv로 변환되는 속성을 더 잘 제어 할 수 있습니다.

d3.csv.formatd3.csv.formatRows 위키 페이지를     참조하십시오 .

jquery-csv , PapaParse 와 같은 다른 라이브러리도 있습니다 . Papa Parse에는 종속성이 없습니다. jQuery도 없습니다.

jquery 기반 플러그인의 경우이를 확인하십시오 .


1
이것은 나를 위해 잘 작동했습니다. D3 API는 2017.v3 (현재 v4) 이후 변경되었습니다. github.com/d3/d3-dsv/blob/v1.2.0/README.md#csvFormat
aljabear

7

이 예제를 시도하십시오

예 1 :

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

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

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

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

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

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

예 2 :

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

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

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

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

다음 코드를 사용하여 csv 파일을 다운로드 할 수도 있습니다.

function downloadCSV(csvStr) {

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

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

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

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

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

1

다음은 최신 js 버전에 대해 객체 지향 방식으로 동적 딥 객체에 대해 수행하는 방법입니다. region 다음에 seperatortype을 변경해야 할 수도 있습니다.

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

때로는 개체의 길이가 다릅니다. 그래서 나는 Kyle Pennell과 같은 문제에 부딪 혔습니다. 그러나 배열을 정렬하는 대신 단순히 배열을 탐색하여 가장 긴 배열을 선택합니다. 시간 복잡도는 먼저 정렬 할 때 O (n log (n))에 비해 O (n)으로 감소합니다.

저는 Christian Landgren의 업데이트 된 ES6 (2016) 버전 의 코드로 시작했습니다 .

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

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

1

나는 위의 @Christian Landgren의 대답을 무시하고 싶었습니다. 내 CSV 파일에 3 개의 열 / 헤더 만있는 이유가 혼란 스러웠습니다. 이것은 내 json의 첫 번째 요소에 3 개의 키만 있기 때문입니다. 따라서 const header = Object.keys(json[0])선에 주의해야합니다 . 배열의 첫 번째 요소가 대표적이라고 가정합니다. 일부 객체에 다소간 JSON이 있습니다.

그래서 array.sort키 수에 따라 JSON을 정렬하는를 추가했습니다 . 따라서 CSV 파일은 최대 열 수를 갖게됩니다.

이것은 또한 코드에서 사용할 수있는 함수입니다. JSON을 공급하십시오!

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

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

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

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

1

중첩 된 개체 및 탭 구분 기호로 작업하기위한 praneybehl 답변 의 적응

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

  let str = '';

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

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

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

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

1
Excel / Sheets에 직접 복사하여 붙여 넣는 데 적합합니다. 감사!
UP3

0

Csv를 작성하십시오.

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

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

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

2
나는 이것이 많은 가치가 있다고 생각하지 않습니다. 이것이 질문에 답하는 데 어떻게 도움이되는지에 대한 설명을 추가 하려면 편집 하십시오 .
fedorqui 'SO stop harming'Feb

0

완전하지도 않고 여기에서 작동하는 것도 웃기는 일이 아닙니다 (IE 또는 node.js). 유사한 질문 인 약간의 구조화 된 JSON (다시 복사 할 필요가 없다고 가정)에 대한 답변과 데모 스 니펫도 포함되어 있습니다. JSON에서 CSV로 변환 (JavaScript) : CSV 변환 형식을 올바르게 지정하는 방법 단일 유형 변환기뿐만 아니라 내 Github (프로필에 언급 됨)에서도 알 수없는 JSON 구조를 분석하는 데 사용되는 것과 유사합니다. 나는이 답변의 코드와 내 Github의 모든 코드의 작성자입니다 (일부 프로젝트는 포크 / + 번역으로 시작된 경우 제외).


0

개인적으로 나는 이것을하기 위해 d3-dsv 라이브러리를 사용할 것 입니다. 왜 reinvent the wheel?


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

트리 쉐이킹 을 사용하면 d3-dsv라이브러리 에서 특정 기능을 가져올 수 있습니다.


0

다음은 개체 배열을 CSV로 변환하는 간단한 버전입니다 (이 개체가 모두 동일한 속성을 공유한다고 가정).

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

csv = csv.join('\n') 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.