2

I need to convert my JSON to a CSV file, but I don't know how to do it correctly.

I have this code already

      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;

But I expect a different result then what I have now

wrong result

I need this expected result

  function 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;
  }
  
  function downloadCSV () {
    let data = [{"am":{"a3":2,"a1":5,"a2":2},"zul":{"mer":1,"spi":1,"aut":1,"inf2":1,"int":1,"infl":1,"les":1},"kaab":      {"ka11":6,"ka12":6,"ka10":6},"kg3":"fdsf","ges":1,"alt":3,"kawe":{"ka9":4,"ka7":5,"ka8":5},"kaak":{"ka2":4,"ka3":5,"ka4":5,"ka1":4,"ka5":3,"ka6":5},"kg4":2,"kg1":5,"eink":"","kg2":4,"soz2":"","solz":"2","ae":{"a6":2,"a5":2,"a4":6}}]
    
    let result = ConvertToCSV(data);
    
    let fileToSave = new Blob([result], {
       type: "csv",
       name: 'data.csv
     });

     saveAs(fileToSave, 'data.csv);
  }
  
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js"></script>
<button onclick="downloadCSV">download csv</button>

1 Answer 1

3

You can try this

function downloadCSV () {

    let arr = [{"am":{"a3":2,"a1":5,"a2":2},"zul":{"mer":1,"spi":1,"aut":1,"inf2":1,"int":1,"infl":1,"les":1},"kaab":      {"ka11":6,"ka12":6,"ka10":6},"kg3":"fdsf","ges":1,"alt":3,"kawe":{"ka9":4,"ka7":5,"ka8":5},"kaak":{"ka2":4,"ka3":5,"ka4":5,"ka1":4,"ka5":3,"ka6":5},"kg4":2,"kg1":5,"eink":"","kg2":4,"soz2":"","solz":"2","ae":{"a6":2,"a5":2,"a4":6}},
 {"am":{"a3":2,"a1":5,"a2":2},"zul":{"mer":1,"spi":1,"aut":1,"inf2":1,"int":1,"infl":1,"les":1},"kaab":      {"ka11":6,"ka12":6,"ka10":6},"kg3":"fdsf","ges":1,"alt":3,"kawe":{"ka9":4,"ka7":5,"ka8":5},"kaak":{"ka2":4,"ka3":5,"ka4":5,"ka1":4,"ka5":3,"ka6":5},"kg4":2,"kg1":5,"eink":"","kg2":4,"soz2":"","solz":"2","ae":{"a6":2,"a5":2,"a4":6}}   
    ];
  
    var keys = [];
    var values = [];
    function getKeys(data, k = '') {
      for (var i in data) {
        var rest = k.length ? '_' + i : i
        if (typeof data[i] == 'object') {
          if (!Array.isArray(data[i])) {
            getKeys(data[i], k + rest)
          }
        } else keys.push( k+ rest)
      }
    }   
    function getValues(data, k = '') {
      for (var i in data) {
        var rest = k.length ? '' + i : i
        if (typeof data[i] == 'object') {
          if (!Array.isArray(data[i])) {
            getValues(data[i], k + rest)
          }
        }
        else values.push(data[rest])
      }
    }

    getKeys(arr[0])
    var value="";
    arr.forEach(x=>{
       values=[];
       getValues(x);
       value+=values.join(";")+"\r\n";
    })
    
    let result = keys.join(";")+"\r\n"+value;
    let fileToSave = new Blob([result], {
       type: "csv",
       name: 'data.csv'
     });
        
    saveAs(fileToSave, 'data.csv');
  }
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/FileSaver.min.js"></script>
<button onclick="downloadCSV()">download csv</button>

Sign up to request clarification or add additional context in comments.

9 Comments

this looks much better. Thank you
But all the data is in one row, thats a problem
I need to have for each main object one row in excel file
I need to have one row for each object So if inside the let arr= [{}, {}, {}] more objects
Yeah that better. But one last thing:
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.