You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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(";")

方案优势

  1. 避免转义混乱:跳过@csv生成带引号的格式,直接用join(";")生成分号分隔的行,彻底绕开引号和自动转义的问题。
  2. 逻辑统一:所有字段转换(小数点换逗号)都在jq内完成,无需后续sed多次处理,减少出错概率。
  3. 高效简洁:表头直接由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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 09:25:57