JavaScript 如何将CSV转换为JSON文件
CSV文件是一种常用的文件格式,用于以表格形式存储数据。当用户希望以一种可以轻松在本地机器上打开和阅读的方式下载结构化的信息时,它们尤其有用。由于其可移植性和普适性,CSV文件非常理想。
在本文中,我们将解释如何将JavaScript对象JSON转换为CSV文件格式,以及相反的过程。该代码不使用任何外部库,因此它适用于浏览器和Node.js环境。
从JSON转换为CSV
要将JSON转换为CSV,我们首先需要识别CSV文件的标题。为此,让我们获取传入的每个JavaScript对象中存在的键的列表。使用Object.keys()
方法来获取这个键的列表。
<script>
const JSONToCSV = (objArray, keys) => {
let csv = keys.join(',');
objArray.forEach((row) => {
let values = [];
keys.forEach((key) => {
values.push(row[key] || '');
});
csv += '\n' + values.join(',');
});
return csv;
};
const exampleJSON = [
{
"date": 20210307,
"positives": 28756184,
"fatalities": 515148
},
{
"date": 20210306,
"positives": 28714654,
"fatalities": 514309
},
{
"date": 20210305,
"positives": 28654639,
"fatalities": 512629
},
{
"date": 20210304,
"positives": 28585852,
"fatalities": 510408
},
{
"date": 20210303,
"positives": 28520365,
"fatalities": 508665
},
{
"date": 20210302,
"positives": 28453529,
"fatalities": 506216
},
{
"date": 20210301,
"positives": 28399281,
"fatalities": 504488
}
];
console.log(JSONToCSV(exampleJSON,
['date', 'positives', 'fatalities']));
</script>
这段代码可以简化为:
<script>
const JSONToCSV = (objArray, keys) => [
keys.join(','), ...objArray.map(
row => keys.map(k => row[k] || '')
.join(','))].join('\n');
const exampleJSON = [
{
"date": 20210307,
"positives": 28756184,
"fatalities": 515148
},
{
"date": 20210306,
"positives": 28714654,
"fatalities": 514309
},
{
"date": 20210305,
"positives": 28654639,
"fatalities": 512629
},
{
"date": 20210304,
"positives": 28585852,
"fatalities": 510408
},
{
"date": 20210303,
"positives": 28520365,
"fatalities": 508665
},
{
"date": 20210302,
"positives": 28453529,
"fatalities": 506216
},
{
"date": 20210301,
"positives": 28399281,
"fatalities": 504488
}
];
console.log(JSONToCSV(exampleJSON,
['date', 'positives', 'fatalities']));
</script>
输出:
date, positives, fatalities
20210307, 28756184, 515148
20210306, 28714654, 514309
20210305, 28654639, 512629
20210304, 28585852, 510408
20210303, 28520365, 508665
20210302, 28453529, 506216
20210301, 28399281, 504488
从CSV转为JSON
要将CSV转为JSON,首先通过解析CSV标题识别出每个JavaScript对象的键列表,然后对于每一行CSV,向一个新的对象中添加每个键和值。
<script>
const CSVToJSON = csv => {
const lines = csv.split('\n');
const keys = lines[0].split(',');
return lines.slice(1).map(line => {
return line.split(',').reduce((acc, cur, i) => {
const toAdd = {};
toAdd[keys[i]] = cur;
return { ...acc, ...toAdd };
}, {});
});
};
const exampleCSV = `
date,positives,fatalities
20210307,28756184,515148
20210306,28714654,514309
20210305,28654639,512629
20210304,28585852,510408
20210303,28520365,508665
20210302,28453529,506216
20210301,28399281,504488`;
console.log(CSVToJSON(exampleCSV));
</script>
输出: