【问题标题】:How to convert json with array into csv?如何将带有数组的json转换为csv?
【发布时间】:2017-01-08 20:00:18
【问题描述】:

我知道 jq 可以做到这一点,但增加了复杂性。 json 对象中的一个字段是字符串数组。我们如何用 jq 处理这个问题?

{
    "var": 1,
    "section": ["1","2","3"],
    "x": "test1"
},
{
    "var": 2,
    "section": ["2","3","4"],
    "x": "test2"
},
{
    "var": 3,
    "section": ["3","4","5"],
    "x": "test3"
},

我们如何制作这样的 CSV 输出?

var,section,x
"1","[1,2,3]","test1"
"2","[2,3,4]","test2"
"3","[3,4,5]","test3"

我正在考虑在 jq 参数中使用 JSON.stringify。

【问题讨论】:

    标签: json csv jq


    【解决方案1】:

    需要注意的是你必须小心你想要什么,并假设输入是一个对象数组,如下所示:

    .[]
    | [.[]
       | if type == "array" then map(tonumber? // .) else . end
       | tostring]
    | @csv
    

    产生所需的输出,但标题行除外。

    ("tonumber? // ." 可以避免数组内容无法转换为数字时出错。)

    泛化

    这是一个变体,它 (a) 为第一个对象中的所有键生成一行标题,无论它们可能是什么;并且 (b) 在对对象中的键重新排序方面是稳健的:

    . as $in | ($in[0] | keys_unsorted) as $h | ($h, ( $in[] | ( [range(0; $h|length) as $i | getpath( [$h[$i]] )] | map(if type == "array" then map(tonumber? // .) else . end) | map(tostring) ) )) | @csv

    在 tocsv.jq 和 input.json 中输入:

    $ jq -r -f tocsv.jq input.json "var","section","x" "1","[""a"",2,3]","test1" "2","[2,3,4]","test2" "3","[3,4,5]","test3"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2018-06-21
      • 2020-12-17
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多