如何在Node-express中实现JSON按各key拆分表头转换为CSV
实现方案
完全可以实现,以下是Node + Express 环境下的完整实现代码,转换后的CSV格式和你给出的示例完全匹配:
1. 核心转换函数
首先编写JSON转目标CSV格式的工具方法,会自动处理字段含特殊字符的转义问题:
// 转义CSV特殊字符(逗号、引号、换行) const escapeCsvField = (field) => { const str = String(field); if (str.includes(',') || str.includes('"') || str.includes('\n')) { return `"${str.replace(/"/g, '""')}"`; } return str; }; // 输入JSON转目标格式CSV const jsonToTargetCsv = (inputData) => { const csvBlocks = []; // 遍历每个顶级key对应的数组 for (const dataList of Object.values(inputData)) { if (!dataList.length) continue; // 生成当前块的表头 const headers = Object.keys(dataList[0]).map(escapeCsvField).join(','); // 生成当前块的所有数据行 const rows = dataList.map(item => Object.values(item).map(escapeCsvField).join(',') ); // 拼接当前块,加入块列表 csvBlocks.push([headers, ...rows].join('\n')); } // 不同块之间用空行分隔 return csvBlocks.join('\n\n'); };
2. Express接口实现
可以直接做一个接口,访问时自动下载生成的CSV文件:
const express = require('express'); const app = express(); const port = 3000; // 你的原始数据,也可以改成接口接收动态传入的JSON const inputData = { keyOne: [{ keyOneColOne: 1345, keyOneColTwo: 546, keyOneColThree: 769 }], keyTwo: [ { keyTwoColOne: 1, keyTwoColTwo: 2, keyTwoColThree: 2, keyTwoColFour: 1 }, { keyTwoColOne: 1, keyTwoColTwo: 2, keyTwoColThree: 2, keyTwoColFour: 1 } ], keyThree: [ { keyThreeColOne: 22, keyThreeColTwo: 23, keyThreeColThree: 24, keyThreeColFour: 25 }, { keyThreeColOne: 22, keyThreeColTwo: 23, keyThreeColThree: 24, keyThreeColFour: 25 } ] }; // CSV下载接口 app.get('/download-csv', (req, res) => { const csvContent = jsonToTargetCsv(inputData); // 设置响应头,指定为CSV文件下载 res.setHeader('Content-Type', 'text/csv; charset=utf-8'); res.setHeader('Content-Disposition', 'attachment; filename=output.csv'); // 处理UTF-8 BOM,避免中文乱码 res.write('\ufeff'); res.send(csvContent); }); app.listen(port, () => { console.log(`服务启动成功,访问 http://localhost:${port}/download-csv 即可下载CSV文件`); });
3. 输出CSV效果
生成的CSV内容如下,和你提供的示例格式完全一致:
keyOneColOne,keyOneColTwo,keyOneColThree 1345,546,769 keyTwoColOne,keyTwoColTwo,keyTwoColThree,keyTwoColFour 1,2,2,1 1,2,2,1 keyThreeColOne,keyThreeColTwo,keyThreeColThree,keyThreeColFour 22,23,24,25 22,23,24,25
如果需要生成CSV文件保存到本地,只需要用fs模块的writeFile方法把csvContent写入.csv后缀的文件即可。
内容的提问来源于stack exchange,提问作者fractal397
相关产品推荐
相关产品推荐

