【问题标题】:Use JQ to form new arrays from items in arrays by index使用 JQ 通过索引从数组中的项目形成新数组
【发布时间】:2021-09-06 14:38:23
【问题描述】:

我有一些非常典型的 CSV 样式数据的 JSON 数据,但是它以 JSON 表示。我正在努力找出正确的 jq 表达式以将以下 JSON 转换回一些 JSON,这些 JSON 可以使用 @csv 生成适当的 CSV。

“列”的数量是固定的,即"AAA" 值,但每个“列”中的值数量是动态的,但跨列是固定的。即"AAA""BBB""CCC"等数组的长度都是一样的,但是长度是动态的,可以在数据集之间变化。

输入(注意存在的无效数字,以举例说明):

{
  "AAA": [
    111.1,
    111.2,
    111.3,
    111..,
    111.n
  ],
  "BBB": [
    222.1,
    222.2,
    222.3,
    222..,
    222.n
  ],
  "CCC": [
    333.1,
    333.2,
    333.3,
    333..,
    333.n
  ],
  "DDD": [
    444.1,
    444.2,
    444.3,
    444..,
    444.n
  ],
  "EEE": [
    555.1,
    555.2,
    555.3,
    555..,
    555.n
  ]
}

所需的输出(注意存在的无效数字,以说明示例):

{
  [        
    "AAA", 
    "BBB", 
    "CCC", 
    "DDD", 
    "EEE"  
  ],
  [
    111.1,
    222.1,
    333.1,
    444.1,
    555.1
  ],
  [
    111.2,
    222.2,
    333.2,
    444.2,
    555.2
  ],
  [
    111.3,
    222.3,
    333.3,
    444.3,
    555.3
  ],
  [
    111..,
    222..,
    333..,
    444..,
    555..
  ],
  [
    111.n,
    222.n,
    333.n,
    444.n,
    555.n
  ]
}

这是所需的 CSV,用于说明目的(使用 @csv 进行转换非常简单):

AAA,BBB,CCC,DDD,EEE
111.1,222.1,333.1,444.1,555.1
111.2,222.2,333.2,444.2,555.2
111.3,222.3,333.3,444.3,555.3
111..,222..,333..,444..,555..
111.n,222.n,333.n,444.n,555.n

如果没有包含"AAA"'header'值的结果对象中的第一个数组,所需的表达式要容易得多,那么没有它们我也可以轻松生活。

谢谢。

【问题讨论】:

    标签: arrays csv jq


    【解决方案1】:

    您可以使用jq 中的transpose 函数对由键/值组成的数组进行转置。

    jq '[ to_entries[] | [.key, .value[]] ] | transpose'
    

    大部分魔术是由内置转置执行的,但在此之前,您只需将值收集到数组数组中。可以使用@csv 函数生成 CSV 结果。

    jq --raw-output '[ to_entries[] | [.key, .value[]] ] | transpose[] | @csv'
    

    您也可以使用map() 并避免使用多余的[..]

    jq 'to_entries | map([.key, .value[]]) | transpose'
    jq --raw-output 'to_entries | map([.key, .value[]]) | transpose[] | @csv'
    

    【讨论】:

    • 这些工作完美 - 非常感谢@Inian!看起来我在使用to_entriestranspose 的过程中可能只完成了一半,所以我可能已经挣扎了很长时间才能得到我需要的结果。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多