NodeJS中csvtojson如何将一列拆分为两个键值对
Node.js CSV转JSON:拆分Name列为firstName和lastName的最优实现
需求回顾
需要将CSV文件转换为JSON,同时完成:
- 对指定字段(如phone)进行SHA1哈希处理
- 修改表头名称以匹配目标字段要求
- 将CSV中的
Name列拆分为firstName(名字)和lastName(姓氏)两个字段
示例CSV内容
email,phone,Name,zipcode,country,gender,Price email1@email.com,1-(650)-561-5622,Eliza Rabbit,94046,US,Female,"$15,00"
问题分析
你之前尝试添加空格作为列分隔符的方式不可行,因为csvtojson的delimiter参数是用来定义CSV列之间的分隔符,而非字段内部内容的分隔符。列内的空格属于字段值的一部分,无法通过列分隔符拆分。
最优解决方案
使用csvtojson的transform回调函数,在CSV转换为JSON对象后,对姓名字段进行拆分,同时完成表头重命名和哈希处理。这种方式灵活可控,还能兼容姓氏包含空格的场景(如"Van Helsing"这类复姓/带中间名的情况)。
修改后的代码
const csv = require('csvtojson'); const sha1 = require('sha1'); const csvFilePath = 'filepath'; csv({ trim: true, delimiter: ",", // 仅保留逗号作为列分隔符 noheaders: false, // 先映射为直观的临时表头,方便后续处理 headers: ['tempEmail', 'tempPhone', 'fullName', 'tempZip', 'country', 'tempGender', 'price'], colParser: { // 对手机号进行SHA1哈希处理 "tempPhone": (item) => sha1(item) }, // 转换后处理每个JSON对象 transform: (jsonObj) => { // 拆分姓名:名字取第一部分,姓氏取剩余所有部分(兼容含空格的姓氏) const nameSegments = jsonObj.fullName.split(' '); jsonObj.firstName = nameSegments[0]; jsonObj.lastName = nameSegments.slice(1).join(' '); // 重命名表头以匹配目标字段要求 jsonObj.em = jsonObj.tempEmail; jsonObj.ph = jsonObj.tempPhone; jsonObj.zp = jsonObj.tempZip; jsonObj.ge = jsonObj.tempGender; // 删除临时字段 delete jsonObj.tempEmail; delete jsonObj.tempPhone; delete jsonObj.fullName; delete jsonObj.tempZip; delete jsonObj.tempGender; return jsonObj; } }) .fromFile(csvFilePath) .then((result) => { console.log(result); });
输出结果
[ { "country": "US", "price": "$15,00", "firstName": "Eliza", "lastName": "Rabbit", "em": "email1@email.com", "ph": "937a997da6b9f647b3b378ef27f91952eb09fd26", "zp": "94046", "ge": "Female" } ]
方案优势
- 灵活性高:通过
transform函数可以一次性完成字段拆分、表头重命名、冗余字段清理等操作 - 鲁棒性强:处理姓氏包含空格的场景,避免简单拆分导致的姓氏丢失
- 代码可读性好:临时表头命名直观,逻辑清晰易维护
内容的提问来源于stack exchange,提问作者Tico
相关产品推荐
相关产品推荐

