如何使用json2csv正确将多个JSON文件合并输出为单个CSV
多JSON文件合并为单CSV(无重复表头)实现方案
问题背景
需要将多个结构一致的NFT元数据JSON文件合并为同一个CSV文件,单条JSON结构示例:
{ "address": "0xe9f6191596bca549e20431978ee09d3f8db959a9", "copyright": "None", "created_at": "None" // 其余字段省略 }
原有脚本逻辑为遍历哈希列表,调用接口拉取单个JSON后调用json2csv转换,先后尝试两种写法均存在问题:
- 使用
-o参数指定输出文件:每次执行会覆盖已有内容,最终CSV仅保留最后一条数据 - 使用
>>追加重定向、或先转单个CSV再cat拼接:每次转换都会自动生成表头,最终CSV出现多行重复表头
可行解决方案
以下方案均可实现无重复表头的合并效果,可根据自身场景选择:
方案1:控制表头输出逻辑(改动最小,适配原有脚本流程)
json2csv CLI提供了--no-header(简写-n)参数,开启后转换时不会输出表头行。只需在循环中判断是否为第一个处理的文件:第一个文件正常输出带表头的内容,后续所有文件追加时跳过表头即可。
修改后的完整脚本如下:
mkdir -p curl_outs # 提前清空目标CSV文件 > main.csv # 标记是否为第一条数据 first_record=1 { cat hashes.hash; echo; } | while read h; do echo "Downloading $h" curl -L https://main.net955305.contentfabric.io/s/main/q/$h/meta/public/nft > curl_outs/$h.json; node index.js $h; if [ $first_record -eq 1 ]; then # 第一条数据正常转换,写入表头+内容 json2csv -i curl_outs/$h.json >> main.csv first_record=0 else # 后续数据转换时跳过表头,仅追加内容行 json2csv -i curl_outs/$h.json --no-header >> main.csv fi done
方案2:直接拼接已生成的单个CSV文件(无需重新转换)
如果你已经把所有单个JSON都转成了独立CSV存放在csv_outs目录,不需要重新跑转换流程,用awk命令即可自动跳过所有非首文件的表头完成拼接:
# 先清空目标文件 > main.csv # 遍历所有单个CSV,第一个文件全量写入,其余文件从第2行开始写入 awk 'FNR==1 && NR!=1 {next} {print}' csv_outs/*.csv > main.csv
命令逻辑说明:
FNR==1代表当前读取到某一个文件的第一行(也就是表头行)NR!=1代表当前不是全局第一行(也就是不是第一个文件的表头)- 满足以上两个条件时跳过该行,其余行全部正常写入
方案3:合并JSON后单次转换(效率最高,无中间冗余文件)
如果不需要保留单个JSON的中间文件,可以直接把所有接口返回的JSON对象整合成一个JSON数组,最后只调用一次json2csv完成转换,从根源上避免重复表头问题,执行效率更高:
mkdir -p curl_outs # 初始化JSON数组 echo "[" > all_nft.json first_record=1 { cat hashes.hash; echo; } | while read h; do echo "Downloading $h" if [ $first_record -eq 1 ]; then first_record=0 else # 非第一条数据前加逗号分隔 echo "," >> all_nft.json fi curl -L https://main.net955305.contentfabric.io/s/main/q/$h/meta/public/nft >> all_nft.json; node index.js $h; done # 闭合JSON数组 echo "]" >> all_nft.json # 单次转换,直接生成带唯一表头的完整CSV json2csv -i all_nft.json -o main.csv
内容的提问来源于stack exchange,提问作者Thavas Antonio
相关产品推荐
相关产品推荐

