【问题标题】:Parse json output using jq使用 jq 解析 json 输出
【发布时间】:2019-08-15 02:27:09
【问题描述】:

首先,非常感谢您的支持。

我无法将 json 输出解析为 csv 格式。我能够得到某种输出,但这不符合预期。

Curl 命令输出

{
    "results": [{
            "name": "smith Jones",
            "DOB": "1992-03-26",
            "Enrollmentdate": "2013-08-24"

        },

        {
            "name": "Jacob Mathew",
            "DOB": "1993-03-26",
            "Enrollmentdate": "2014-10-02"
        },

        {
            "name": "Anita Rodrigues",
            "DOB": "1994-03-26",
            "Enrollmentdate": "2015-02-19"
        }
    ]
}

JQ 常用

<curl-command>|jq '.results | map(.name), map(.DOB), map(.Enrollmentdate) | @csv' >file.csv

我的输出

smith jones, Jacob Mathew, Anita Rodrigues
1992-03-26, 1993-03-26, 1994-03-26
2013-08-24, 2014-10-02, 2015-02-19 

这可能不完全是 csv,但下面是预期的输出。

Name                 DOB             Enrollmentdate
smith jones,       1992-03-26,        2013-08-24
jacob Mathew,      1993-03-26,        2014-10-02
Anitha Rodrigues,  1994-03-26,        2015-02-19

【问题讨论】:

    标签: json export-to-csv jq


    【解决方案1】:

    使用您的示例 JSON,调用:

    jq -r '
      .results[]
      | [.name, .DOB, .Enrollmentdate ]
      | @csv'
    

    产生:

    "smith Jones","1992-03-26","2013-08-24"
    "Jacob Mathew","1993-03-26","2014-10-02"
    "Anita Rodrigues","1994-03-26","2015-02-19"
    

    如果您不想要(在这种情况下)多余的引号,您可以将@csv 替换为join(","),但最好编写一个简单的过滤器来处理带有逗号等的值。

    标题

    如果第一个结果的键顺序正确,您可以逃脱:

      (.results[0] | keys_unsorted),
      (.results[]
      | [.name, .DOB, .Enrollmentdate ])
      | @csv
    

    但最好使用一些 jq 魔法,如下所示:

      (.results[0] | keys_unsorted) as $headers
      | $headers,
        (.results[]
         | [getpath($headers[]|[.])])
      | @csv
    

    【讨论】:

    • 谢谢!这就像一个魅力:) 但我如何打印键名(姓名、出生日期、注册日期)?我可以编写一个 bash 脚本来生成它,但想知道 JQ 是否可以解决它。
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多