如何在Python/Node.js中转换CSV为带正确数据类型的JSON?
实现CSV到带类型JSON的转换(Node.js)
核心逻辑
CSV结构规则:
- 第1行:字段名(支持300+属性)
- 第2行:对应字段的数据类型(仅
string/number/boolean三种) - 第3行及以后:数据行
空值处理规则:
- 字符串类型字段:空值(空字符串)返回
null - 数字类型字段:空值返回
0 - 布尔类型字段:空值返回
false
实现步骤:
- 读取CSV文件,用流式解析避免内存溢出
- 捕获字段名行和类型定义行
- 对每一行数据,按对应字段的类型完成值转换与空值处理
- 收集转换后的数据,最终输出JSON
依赖选择
使用csv-parser库,轻量且支持流式处理,适合大文件和多属性场景。先安装依赖:
npm install csv-parser
完整代码实现
const fs = require('fs'); const csv = require('csv-parser'); // 类型转换与空值处理函数 const convertValue = (value, type) => { // 处理空字符串情况 if (value === '') { switch (type) { case 'string': return null; case 'number': return 0; case 'boolean': return false; default: return value; } } // 非空值类型转换 switch (type) { case 'number': const num = Number(value); return isNaN(num) ? 0 : num; // 非数字格式内容默认转0,可按需调整 case 'boolean': return value.toLowerCase() === 'true'; // 仅"true"转true,其他转false case 'string': default: return value; } }; const csvToTypedJson = (csvFilePath) => { return new Promise((resolve, reject) => { const results = []; let headers = []; let types = []; let rowCount = 0; fs.createReadStream(csvFilePath) .pipe(csv({ headers: false })) // 手动处理表头,因为第二行是类型 .on('data', (row) => { rowCount++; if (rowCount === 1) { // 第一行是字段名 headers = Object.values(row); } else if (rowCount === 2) { // 第二行是类型定义 types = Object.values(row); } else { // 数据行处理 const typedRow = {}; headers.forEach((header, index) => { const rawValue = row[index]; const type = types[index]; typedRow[header] = convertValue(rawValue, type); }); results.push(typedRow); } }) .on('end', () => { resolve(JSON.stringify(results, null, 2)); }) .on('error', (err) => { reject(err); }); }); }; // 使用示例 csvToTypedJson('./data.csv') .then(json => { console.log(json); // 写入输出文件 fs.writeFileSync('./output.json', json); }) .catch(err => { console.error('转换失败:', err); });
测试示例
输入CSV(data.csv)
username,age,isVerified,email string,number,boolean,string John Doe,,true, Jane Smith,28,,jane@example.com ,,false,
输出JSON(output.json)
[ { "username": "John Doe", "age": 0, "isVerified": true, "email": null }, { "username": "Jane Smith", "age": 28, "isVerified": false, "email": "jane@example.com" }, { "username": null, "age": 0, "isVerified": false, "email": null } ]
注意事项
- 确保类型行的类型值严格为
string/number/boolean,若需支持其他类型(如date),可扩展convertValue函数的分支逻辑 - 流式处理适合大体积CSV文件,300+属性的场景下性能不受影响
- 数字转换时,若遇到非数字格式的非空值(如"abc"),当前代码默认返回0,可根据业务需求改为抛出错误或保留原始值
- 布尔类型转换仅识别大小写的"true"为
true,其他非空值均返回false,可按需调整判断逻辑
内容的提问来源于stack exchange,提问作者JameyPlay
相关产品推荐
相关产品推荐

