【问题标题】:Convert Json Array into CSV将 Json 数组转换为 CSV
【发布时间】:2020-11-26 08:12:14
【问题描述】:

我想将 JSON 数组转换为 CSV 格式。我希望 CSV 的第一行是数据的标签。

我的数组有一个样本:

objArray = [
    {"idMachine": 195, "LabelStop": "No more piece", "LabelNC": "Default"},
    {"idMachine": 214, "LabelStop": "No more box", "LabelNC": "Default"}
]

而我想要的结果:

idMachine;LabelStop;LabelNC
195;No more piece;Default
214;No more box;Default

目前,我的代码如下所示:

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 (i == 0) {
                if (line != '') line += ';'
        
                line += index;
        
            } else {
                if (line != '') line += ';'
        
                line += array[i][index];
            }
        }
        str += line + '\r\n';
    }
    return str;
}

问题是第一行是数据标签,但第一个值被跳过了。我的 CSV 看起来像这样:

idMachine;LabelStop;LabelNC
214;No more box;Default

【问题讨论】:

  • 当然第一行的值被跳过了——因为你只在else分支中添加值,并且if (i == 0)对于第一行是真的,它永远不会添加值。
  • @CBroe 是的,但我不知道如何纠正我的程序..

标签: javascript arrays csv


【解决方案1】:

您当前正在遍历数组中的项目,然后是每个项目的各个属性 - 因此您将无法使用 line += 以这种方式执行此操作,因为数据未正确输入订购。

如果您只为标题行使用额外的辅助变量,然后在最后将其添加到输出的其余部分,则最简单。 else 只是被删除,并且您在其中的代码在任何情况下都会执行,而不仅仅是在 i!=0 时执行(这样您也可以从第一项中获取 data,您的 if/ else 构造首先使它被“跳过”。)

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

        for (var index in array[i]) {
            if (i == 0) {
                if (header != '') {
                   header += ';'
                }
                header += index;
            }
            if (line != '') {
              line += ';'
            }
            line += array[i][index];
        }
        str += line + '\r\n';
    }
    return (header + '\r\n' + str);
}

【讨论】:

  • 好的,我明白我的程序出了什么问题。我试过你的版本,效果更好。非常感谢。
【解决方案2】:

试试这个。

let objArray = [
    { "idMachine": 195, "LabelStop": "No more piece", "LabelNC": "Default" },
    { "idMachine": 214, "LabelStop": "No more box", "LabelNC": "Default" }
]

const header = Object.keys(objArray[0])
let csv = objArray.map(row => header.map(fieldName => JSON.stringify(row[fieldName])).join(';'))
csv.unshift(header.join(','))
csv = csv.join('\r\n')

console.log(csv);

【讨论】:

  • 感谢您的回答,但我有这个错误objArray.map is not a function 不起作用。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2015-03-05
  • 2019-10-11
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
相关资源
最近更新 更多