【问题标题】:Conversion of JSON to CSV using Javascript doesnt give Keys使用 Javascript 将 JSON 转换为 CSV 不会提供密钥
【发布时间】:2018-01-11 18:25:47
【问题描述】:

我已经使用 JavaScript 将 JSON 转换为 CSV,但是以一种奇怪的方式,我没有看到标题被传输到 CSV 文件。我只看到相应的值。

下面是

的例子

1) JSON ....

[
  {
    "entityid": 2,
    "personid": 45676
  }
]

2) JavaScript 代码 ....

function DownloadJSON2CSV(objArray)
    {
        alert(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] + ',';
            if (line != '') line += ','
                line += array[i][index];


            }

            alert(line);
            // Here is an example where you would wrap the values in double quotes
            // for (var index in array[i]) {
            //    line += '"' + array[i][index] + '",';
            // }

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

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

        alert(str);
        window.open( "data:text/csv;charset=utf-8," + escape(str)) 

    }

3) CSV 输出 ....

2,45676


我应该在文档第一行的 CSV 中看到密钥 - entityidpersonid,但我没有。

【问题讨论】:

  • 代码的哪一部分负责将属性键包含到字符串中?
  • 猜猜这是我缺少键的部分 - entityid, personid -----> for (var index in array[i]) { //line += array[i][索引] + ','; if (line != '') line += ',' line += array[i][index]; }
  • 只要您绝对确定您的 JSON 将始终具有平坦且一致的结构,您只需在字符串中添加 index
  • 感谢您的回复。是的,我的 JSON 将是平坦的,里面没有任何对象,但我没有明白你所说的向字符串添加索引的意思。能详细点吗?

标签: javascript json export-to-csv


【解决方案1】:

此代码将从 json 键中提取标头,此外它还会对其中包含逗号的字段进行双引号。

function convertToCSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';
    var keys = [];
    for(var k in objArray[0]) keys.push(k);
     for (var i = 0; i < keys.length; i++)
     {
         if(i==keys.length-1){str=str+keys[i]+'\r\n'}
             else {str=str+keys[i]+','}
         }
     for (var i = 0; i < array.length; i++) {
        var line = '';
        for (var index in array[i]) {
            if (line != '') line += ','
               if(array[i][index].toString().includes(",") && typeof array[i][index] === 'string'){array[i][index]="\""+array[i][index]+"\""}
                   line += array[i][index];
           }
           str += line + '\r\n';
       }
       return str;
   }

用法:(对于 Node.js)

var fs = require('fs'); //**run** npm install fs **if not installed yet in cmd**
var arrayOfObjects = [{"id":28,"Title":"Sweden"}, {"id":56,"Title":"USA"},{"id":89,"Title":"England"}];
fs.writeFile("./test.csv", convertToCSV(arrayOfObjects));

【讨论】:

    【解决方案2】:

    你没有设置它来输出标题行。

    function DownloadJSON2CSV(objArray)
        {
            var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    
            var str = '';
            var headers = new Array();
    
            for (var i = 0; i < array.length; i++) {
                var line = '';
                var data = array[i];
                for (var index in data) {
                    headers.push(index);
                    if (line != '') {
                        line += ','
                    }
                    line += '"' + array[i][index] + '"';
    
                    console.log('line: ' + line);
                }
                str += line + ((array.length>1) ? '\r\n' : '');
                line = '';
            }
    
            headers = ArrNoDupe(headers);
    
            console.log('headers: ' + headers);
            console.log('str: ' + str);
            str = headers + '\r\n' + str;
            console.log('final str: ' + str);
            window.open( "data:text/csv;charset=utf-8," + escape(str));
    
        }
    
        function ArrNoDupe(a) {
            var temp = {};
            for (var i = 0; i < a.length; i++)
                temp[a[i]] = true;
            var r = [];
            for (var k in temp)
                r.push(k);
            return r;
        }
    

    CSV 输出像这样...

    entityid,personid

    "2","45676"

    【讨论】:

    • 谢谢@daddygames ...这行得通。我正在弄清楚你是如何在 entityid 和 personid 之间的标题中添加逗号的......非常感谢。
    • 我只会从数组中的第一个对象中提取标题。
    • @PM77-1 我这样做的原因是如果对象有附加属性,这些附加属性的名称也可以添加到标题中。这样做的问题是确保它在具有不同属性的对象之间保持一致。我没有以这种方式编码一致性。
    • @Esh 将数组对象附加到字符串时,运行时会自动将数组转换为逗号分隔的字符串值
    • 哦,明白了。想知道这是如何工作的,现在它是有道理的。谢谢。
    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 2021-04-29
    • 2019-05-29
    • 2013-03-01
    • 2018-08-30
    • 2020-08-25
    • 2015-08-23
    相关资源
    最近更新 更多