如何用jq和sed正确格式化CSV输出?解决字符转义问题
问题分析与解决方案
你的核心问题在于依赖@csv生成格式后用多层sed处理,导致转义逻辑混乱,最终出现残留转义符和分隔符替换错误的情况。下面是直接解决问题的修正方案:
修正后的脚本
json_to_csv() { input_file=$1 output_file=$2 # 用jq完成所有格式处理,直接输出分号分隔的内容 jq -r ' # 先输出表头 "Group;Area;Total", # 遍历每个JSON对象 .[] | # 构造字段数组,直接处理Total字段的小数点转逗号需求 [ .Group, .Area, # 如果Total是数字类型(如11.76),转字符串后替换小数点为逗号 # .Total | tostring | gsub("\\."; ","), # 如果Total已是带逗号的字符串(如示例中的11,76),直接取值即可 .Total ] | join(";")' "$input_file" > "$output_file" return $? }
针对你实际JSON结构的调整
如果你的真实JSON是包含MetaData和Data的嵌套结构(对应你原脚本中的逻辑),只需修改jq部分的字段路径:
"Group;Area;Total", .[] | .MetaData as $meta | .Data[] | [ $meta[1].Nombre, $meta[2].Nombre, # 处理数字类型的Valor字段,将小数点替换为逗号 .Valor | tostring | gsub("\\."; ",") ] | join(";")
方案优势
- 避免转义混乱:跳过
@csv生成带引号的格式,直接用join(";")生成分号分隔的行,彻底绕开引号和自动转义的问题。 - 逻辑统一:所有字段转换(小数点换逗号)都在jq内完成,无需后续sed多次处理,减少出错概率。
- 高效简洁:表头直接由jq输出,无需额外用sed插入,操作更高效。
测试输出
用你提供的示例JSON输入,运行修正后的脚本,将得到你期望的结果:
Group;Area;Total A;00;11,76 A;00;11,84 A;00;11,60 A;00;15,98
内容的提问来源于stack exchange,提问作者ArchaeoRG
相关产品推荐
相关产品推荐

