PHP实现CSV转多层级JSON 重复人员数据自动嵌套合并
CSV转指定嵌套JSON实现方案
核心解决重复人员条目合并、嵌套数组追加的问题,整体逻辑不需要复杂操作,靠唯一键映射即可实现。
核心逻辑
不要逐行解析后直接往结果列表塞数据,先以人员唯一标识id为key建立临时映射字典:
- 遍历每一行CSV数据时,先判断当前
id是否存在于映射字典中 - 若不存在:初始化符合目标结构的人员对象,固定字段(id、firstName、lastName)直接赋值,
address和ext初始化为空数组,存入映射字典 - 无论人员是否已存在,都将当前行的address、ext信息追加到对应人员的两个嵌套数组中
- 所有行处理完成后,将映射字典的所有值提取为列表,就是最终符合要求的JSON结构
Python实现代码
import csv import json person_map = {} # 读取|分隔的CSV文件 with open('ps.csv', 'r', encoding='utf-8') as csv_file: reader = csv.DictReader(csv_file, delimiter='|') for row in reader: current_id = row['id'] # 新人员初始化结构 if current_id not in person_map: person_map[current_id] = { "id": current_id, "firstName": row['firstName'], "lastName": row['lastName'], "address": [], "ext": [] } # 追加当前行的地址和扩展信息 person_map[current_id]['address'].append({"address": row['address']}) person_map[current_id]['ext'].append({ "extId": row['extId'], "extName": row['extName'] }) # 转换为结果列表,输出格式化JSON final_result = list(person_map.values()) with open('output.json', 'w', encoding='utf-8') as json_file: json.dump(final_result, json_file, ensure_ascii=False, indent=4)
注意事项
- 用哈希映射存储已处理人员的方式,查找时间复杂度为O(1),数据量较大时性能远高于每次遍历结果列表匹配id
- 所有行的address、ext字段统一走追加逻辑,不要在初始化分支单独写入第一行数据,能减少冗余判断,降低出bug概率
- 如果业务要求同一个人员下不能出现重复地址、重复ext条目,追加前先判断对应值是否已存在于目标数组即可,不需要调整整体逻辑
内容的提问来源于stack exchange,提问作者Kapilraj Parameswararajah
相关产品推荐
相关产品推荐

