繁体   English   中英

将数据导出到 JavaScript 中的 CSV

[英]Export data into a CSV in JavaScript

我有以下格式的数据,

const data = {
    "Class-1": [{
        "section": "A",
        "total": "45",
        "boys": "31",
        "girls": "14",
        "subjects": 3,
        "class-teacher": "ABC"
    }, {
        "section": "B",
        "total": "30",
        "boys": "20",
        "girls": "10",
        "subjects": 3,
        "class-teacher": "XYZ"
    }],
    "Class-2": [{
        "section": "A",
        "total": "40",
        "boys": "25",
        "girls": "15",
        "subjects": 4,
        "class-teacher": "ABC2"
    }],
    "Class-3": [{
        "section": "A",
        "total": "44",
        "boys": "29",
        "girls": "15",
        "subjects": 4,
        "class-teacher": "ABC3"
    }, {
        "section": "B",
        "total": "40",
        "boys": "29",
        "girls": "11",
        "subjects": 4,
        "class-teacher": "XYZ1"
    }],
    "Class-4": [{
        "section": "A",
        "total": "50",
        "boys": "30",
        "girls": "20",
        "subjects": 5,
        "class-teacher": "ABC4"
    }]
}

我想用 JavaScript 将上述数据导出到 CSV 文件中,如下所示, 预期的

我尝试使用d3-dsv ( this ),但无法达到预期的效果。 使用d3-dsv ,如果我将数据展平为一个直接的对象数组,我不会得到类 - Class-1、Class-2、Class-3 和 Class-4。

使用d3-dsv ,如果我提供以下格式的数据,我会得到 output ,如下所示,数据格式-

[{
    "section": "A",
    "total": "45",
    "boys": "31",
    "girls": "14",
    "subjects": 3,
    "class-teacher": "ABC"
}, {
    "section": "B",
    "total": "30",
    "boys": "20",
    "girls": "10",
    "subjects": 3,
    "class-teacher": "XYZ"
}, {
    "section": "A",
    "total": "40",
    "boys": "25",
    "girls": "15",
    "subjects": 4,
    "class-teacher": "ABC2"
}, {
    "section": "A",
    "total": "44",
    "boys": "29",
    "girls": "15",
    "subjects": 4,
    "class-teacher": "ABC3"
}, {
    "section": "B",
    "total": "40",
    "boys": "29",
    "girls": "11",
    "subjects": 4,
    "class-teacher": "XYZ1"
}, {
    "section": "A",
    "total": "50",
    "boys": "30",
    "girls": "20",
    "subjects": 5,
    "class-teacher": "ABC4"
}]

Output CSV- 输出

迭代Object.entries()并且每次迭代创建子标题行并迭代它的数组以推送数据行

 const headings = ['section', 'total','boys', 'girls', 'subjects', 'class-teacher']; const rows = [headings]; Object.entries(data).forEach(([k, arr])=>{ const subHeadRow = Array.from(headings, (el,i) => i? '': k); rows.push(subHeadRow) arr.forEach(o => rows.push(Object.values(o))); }); const csv = rows.map(row => row.map(JSON.stringify)).join('\r\n') console.log(csv)
 <script> const data={"Class-1":[{section:"A",total:"45",boys:"31",girls:"14",subjects:3,"class-teacher":"ABC"},{section:"B",total:"30",boys:"20",girls:"10",subjects:3,"class-teacher":"XYZ"}],"Class-2":[{section:"A",total:"40",boys:"25",girls:"15",subjects:4,"class-teacher":"ABC2"}],"Class-3":[{section:"A",total:"44",boys:"29",girls:"15",subjects:4,"class-teacher":"ABC3"},{section:"B",total:"40",boys:"29",girls:"11",subjects:4,"class-teacher":"XYZ1"}],"Class-4":[{section:"A",total:"50",boys:"30",girls:"20",subjects:5,"class-teacher":"ABC4"}]}; </script>

根据@charlieftl,您不需要 D3 来执行此操作。 但是,如果您想使用 d3-dsv 库,请查看d3.csvFormatBody ,它将采用对象数组并仅提供 csv 格式化的行数据,即没有标题。

在下面的示例中,对于第一行,标题来自第一个键的第一个数组项。

然后迭代数据的键,并为每个键 output 它(例如Class-1 )在一行上,然后下面的行来自数组属性。

 // linefeed const lf = `\r\n`; // keys of object are Class-1, Class-2 etc const keys = Object.keys(data); // get headers from 1st array item of 1st key const headers = Object.keys(data[keys[0]][0]); // initialise the csv output with the headers let csv = `${headers}${lf}`; // for each key, add the Class-N then the rows (with no headers) keys.forEach(key => csv += `${key}${lf}${d3.csvFormatBody(data[key])}${lf}`); // output console.log(csv);
 .as-console-wrapper { max-height: 100%;important: top; 0; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.7.0/d3.min.js"></script> <script> const data={"Class-1":[{section:"A",total:"45",boys:"31",girls:"14",subjects:3,"class-teacher":"ABC"},{section:"B",total:"30",boys:"20",girls:"10",subjects:3,"class-teacher":"XYZ"}],"Class-2":[{section:"A",total:"40",boys:"25",girls:"15",subjects:4,"class-teacher":"ABC2"}],"Class-3":[{section:"A",total:"44",boys:"29",girls:"15",subjects:4,"class-teacher":"ABC3"},{section:"B",total:"40",boys:"29",girls:"11",subjects:4,"class-teacher":"XYZ1"}],"Class-4":[{section:"A",total:"50",boys:"30",girls:"20",subjects:5,"class-teacher":"ABC4"}]}; </script>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM