如何使用NodeJS处理带有父子层级关系的非规范CSV文件
实现方案
判断父子行的规则
你提供的CSV结构有明确的特征可以直接区分行类型:
- 父级行:仅含单个文本值,无逗号分隔的第二列内容
- 子级行:含逗号分隔的两个字段,对应子项的name和value
- 空行、首行表头直接过滤即可
原生NodeJS实现(无第三方依赖)
直接用Node内置的fs和readline模块逐行处理即可,代码如下:
const fs = require('fs'); const readline = require('readline'); const result = []; // 存储当前正在处理的父级对象 let currentParent = null; const rl = readline.createInterface({ input: fs.createReadStream('替换为你的CSV文件路径'), crlfDelay: Infinity }); rl.on('line', (line) => { const trimLine = line.trim(); // 跳过空行和表头行 if (!trimLine || trimLine === 'name, value') return; const parts = trimLine.split(',').map(item => item.trim()); // 判断为父级行 if (parts.length === 1) { currentParent = { // 移除父级名称中的空格,匹配样例输出的"ParentName"格式 name: parts[0].replace(/\s/g, ''), children: [] }; result.push(currentParent); } // 判断为子级行,绑定到最近的父级下 else if (parts.length >= 2 && currentParent) { currentParent.children.push({ name: parts[0], value: parts[1] // 如果需要匹配样例的首字母小写格式,替换上面两行为: // name: parts[0].charAt(0).toLowerCase() + parts[0].slice(1), // value: parts[1].charAt(0).toLowerCase() + parts[1].slice(1) }); } }); rl.on('close', () => { // 输出结果,也可自行写为JSON文件 console.log(JSON.stringify(result, null, 2)); });
适配说明
- 支持多父级场景:如果CSV中存在多个不同的父级名称,会自动生成多个根对象存入结果数组
- 可以自行调整字段格式化规则:比如父级名称是否保留空格、子级字段大小写规则等,修改对应赋值逻辑即可
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

