【问题标题】:Converting a nested JSON into csv with jq使用 jq 将嵌套的 JSON 转换为 csv
【发布时间】:2020-05-06 07:44:09
【问题描述】:

我想使用 jq 将以下 JSON 转换为 csv 格式。我知道有很多类似的问题,但我无法根据它们弄清楚。

{
    "one": {
        "firstName": "John",
        "lastName": "Smith",
        "gender": "man",
        "age": 32,
        "address": {
            "streetAddress": "21 2nd Street",
            "city": "New York",
            "state": "NY",
            "postalCode": "10021"
        }
    },
    "two": {
        "firstName": "Johnny",
        "lastName": "Smithy",
        "gender": "man",
        "age": 33,
        "address": {
            "streetAddress": "22 2nd Street",
            "city": "New York",
            "state": "NY",
            "postalCode": "10021"
        }
    }
}

输出应如下所示。我正在努力将嵌套对象作为地址键的值。

number,firstName,lastName,gender,age,streetAddress,city,state,postalCode
one,John, Smith,man, 32, 21 2nd Street, New York, NY, 10021
two, Johnny, Smith,man, 33, 22 2nd Street, New York, NY, 10021

我能做的最好的事情就是顺势而为,但它并没有接近...... 非常感谢您的帮助

jq --raw-output 'to_entries | map_values({ job: .key } + .value )'

【问题讨论】:

  • 您是否尝试过使用每个对象中的标量创建一个数组并将它们传递给@csv 过滤器?喜欢jq -r 'keys[] as $k | [ $k ] + [ .[$k] | getpath(paths(scalars)) ] | @csv' file
  • 谢谢!看起来很有希望。你知道我如何将键作为标题行吗?像这样:`号码,名字,姓氏,性别,年龄,街道地址,城市,州,邮政编码`
  • 如果它是恒定的,只需将它传递给 csv 过滤器,然后再传递给其他所有内容。否则你可以从第一个对象复制它
  • 不幸的是,它不会是恒定的,你能告诉我在这种情况下怎么做吗?

标签: json bash csv jq


【解决方案1】:

为简洁起见,以下假设所有 .address 对象的键顺序正确:

def headers: "number,firstName,lastName,gender,age,streetAddress,city,state,postalCode";

headers,
(to_entries[]
 | [.key,
    (.value 
     | (.firstName, .lastName, .gender, .age, .address[])) ]
 | join(",") )

在这里,headers已被定义为一个函数,因此您可以轻松地调整它以满足您的需求,例如如果标题字符串应该基于键名。但是,在这种情况下,细节将取决于可以对对象的均匀性做出哪些假设。

【讨论】:

    猜你喜欢
    • 2022-11-02
    • 2017-11-28
    • 2022-08-14
    • 2021-02-27
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多