如何将多个同结构JSON文件合并导出为含指定字段的CSV文件
多同结构JSON合并为指定字段CSV的可行方案
原有方案失败原因
- jsonv方案报错为本地gawk版本与jsonv内置正则规则不兼容,无额外调整价值
- JQ方案报错原因是未展开JSON嵌套结构,直接将嵌套对象传入CSV序列化逻辑,同时存在字段拼写错误(原数据字段为
max_cmds,命令中写为max_cmd) - 原有pandas代码未处理
params嵌套结构,也未做指定字段筛选
方案1:命令行JQ实现(无需额外编程环境)
直接在JSON文件所在目录执行以下命令即可批量合并:
# 写入CSV表头 echo "sequential,write,io_size,max_cmds,seconds,iops,mbs,latency_min,latency_ave,latency_max" > output.csv # 遍历所有JSON文件提取指定字段追加到CSV for file in *.json; do jq -r '.["1"][] | [.params.sequential, .params.write, .params.io_size, .params.max_cmds, .params.seconds, .iops, .mbs, .latency_min, .latency_ave, .latency_max] | @csv' "$file" >> output.csv done
逻辑说明:
.["1"][]先定位顶层键"1"对应的数组,再展开数组内的单条测试记录- 嵌套在
params对象内的字段通过.params.xxx取值,顶层性能指标字段直接通过.xxx取值 - 所有提取值均为基础数据类型,无嵌套对象,不会触发CSV序列化报错
方案2:修正pandas代码(适配原有脚本逻辑)
替换原有Python脚本为以下内容即可:
import pandas as pd import os # 定义需要导出的目标字段 target_cols = [ "sequential", "write", "io_size", "max_cmds", "seconds", "iops", "mbs", "latency_min", "latency_ave", "latency_max" ] record_list = [] for filename in os.listdir(os.getcwd()): _, ext = os.path.splitext(filename) if ext.lower() != ".json": continue # 读取JSON并定位到测试记录数组 json_data = pd.read_json(filename, orient="index").iloc[0,0] for item in json_data: # 提取指定字段,处理params嵌套结构 row = { "sequential": item["params"]["sequential"], "write": item["params"]["write"], "io_size": item["params"]["io_size"], "max_cmds": item["params"]["max_cmds"], "seconds": item["params"]["seconds"], "iops": item["iops"], "mbs": item["mbs"], "latency_min": item["latency_min"], "latency_ave": item["latency_ave"], "latency_max": item["latency_max"] } record_list.append(row) # 导出为CSV,utf-8-sig编码兼容Windows系统打开不乱码 pd.DataFrame(record_list, columns=target_cols).to_csv("output.csv", index=False, encoding="utf-8-sig")
逻辑说明:
- 自动过滤非JSON后缀文件,兼容大小写后缀名
- 正确展开
params嵌套结构提取字段,无冗余字段导出 - 用列表批量收集记录后一次性生成DataFrame,比循环append效率更高
- 导出编码适配Windows系统,避免乱码问题
内容的提问来源于stack exchange,提问作者Suhasini Subramaniam
相关产品推荐
相关产品推荐

