使用JS将CSV转换为按Flag/AttrUnit分组的键值对对象
CSV转分组JSON实现方案
现有CSV数据
Attrname1,AttrValue1,AttrUnit1,Flag1,Attrname2,AttrValue2,AttrUnit2,Flag2,Attrname3,AttrValue3,AttrUnit3,Flag3,Attrname4,AttrValue4,AttrUnit4,Flag4,Attrname5,AttrValue5,AttrUnit5,Flag5 Type,"LTPS IPS LCD",DISPLAY,DISPLAY,Size,"6.3 inches, 99.1 cm2 ",DISPLAY,DISPLAY,Resolution,"1080 x 2280 pixels, 19:9 ratio ",DISPLAY Model,DISPLAY Model,Type,"LTPS IPS, 16M colors",Ram,DISPLAY Model,Size,"6.3 inches, 99.1 cm2 (~82.5% screen-to-body ratio)",DISPLAY Model,DISPLAY Model
预期输出
{ "Display":{ "Type":"LTPS IPS LCD", "Size":"6.3 inches, 99.1 cm2 ", "Resolution":"1080 x 2280 pixels, 19:9 ratio " }, "DISPLAY Model":{ "Type":"LTPS IPS, 16M colors", "Size":"6.3 inches, 99.1 cm2 (~82.5% screen-to-body ratio)" } }
转换规则
Attrname作为键,AttrValue作为值,按照Flag或AttrUnit字段分组。
原代码问题说明
原有实现存在三个核心问题:
data定义为数组类型,每次push生成新的独立对象,无法自动合并同分组的键值对- 遍历逻辑错误:通过对象键的索引拼接属性名,会出现序号不匹配的问题,无法正确取到对应组的Flag、AttrUnit属性
- 多余的数组包装和JSON序列化操作,导致值格式不符合预期
修正后代码
var http = require('http'); var express = require('express'); var port = process.env.PORT || 8089; var app = express(); var appRoutes = require('./routes/appRoutes'); var bodyParser = require('body-parser'); var cors = require('cors'); app.use(express.static('public')); app.use(cors()); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use('/', appRoutes); http.createServer(app).listen(port); const csvFilePath = 'test.csv' const csv = require('csvtojson') var jsonToCSV = require('json-to-csv'); const fileName = 'save-html2.csv'; // 将data修改为对象类型,用于存储分组数据 let data = {}; csv() .fromFile(csvFilePath) .then((jsonObjj) => { jsonObjj.forEach((jsonObj) => { // 遍历5组属性,序号从1到5 for(let i = 1; i <= 5; i++) { const flag = jsonObj[`Flag${i}`]; const unit = jsonObj[`AttrUnit${i}`]; // 按规则判断是否属于该分组 if (flag === unit) { const attrName = jsonObj[`Attrname${i}`]; const attrValue = jsonObj[`AttrValue${i}`]; if (!attrName) continue; // 分组不存在则初始化 if (!data[unit]) { data[unit] = {}; } // 写入键值对 data[unit][attrName] = attrValue; } } }) // 格式化输出结果 console.log(JSON.stringify(data, null, 4)) })
内容的提问来源于stack exchange,提问作者ramesh
相关产品推荐
相关产品推荐

