jq:将带有数组的 JSON 文件转换为 CSV - 转置?

Wea*_*ger 2 csv arrays json jq

我正在尝试使用 jq 将 JSON 输出转换为 CSV。

这是 input.json (精简了很多 - 我最多可能有 600 个数组元素,但每个元素的数量相同):

    {
  "latitude": [39.582, 39.582, 39.582],
  "longitude": [26.675, 26.675, 26.675],
  "drivingDifficultyIndex": [0, 34, 34],
  "iconCode": [31, 11, 11],
  "observationTimeUtcIso": ["2016-06-26T00:20:00+0000", "2016-06-26T01:20:00+0000", "2016-06-26T02:20:00+0000"],
  "precip1Hour": [0.0, 0.1, 0.5]
}
Run Code Online (Sandbox Code Playgroud)

迄今为止我最好的尝试是:

jq --raw-output 'keys , .[] | @csv'
Run Code Online (Sandbox Code Playgroud)

这使得

"drivingDifficultyIndex","iconCode","latitude","longitude","observationTimeUtcIso","precip1Hour"
39.582,39.582,39.582
26.675,26.675,26.675
0,34,34
31,11,11
"2016-06-26T00:20:00+0000","2016-06-26T01:20:00+0000","2016-06-26T02:20:00+0000"
0,0.1,0.5
Run Code Online (Sandbox Code Playgroud)

如何使用 jq 将任意简单的 JSON 转换为 CSV?给出了一些很好的提示,但我最终仍然得到行中的数据(如上所示)而不是列中。

我追求的是这样的:

"latitude","longitude","drivingDifficultyIndex","iconCode","observationTimeUtcIso","precip1Hour"
39.582, 26.675, 0,  31, \2016-06-26T00:20:00+0000\",    0
39.582, 26.675, 34, 11, \"2016-06-26T01:20:00+0000\",   0.1
39.582, 26.675, 34, 11, \"2016-06-26T02:20:00+0000\",   0.5
Run Code Online (Sandbox Code Playgroud)

每个数组中最多有 600 个元素,我需要 CSV 文件为每个数组都有一个单独的列;第 2 行需要向下调换。

有人可以帮助 jq 产生我想要的输出吗?

谢谢...

更新:

jq --raw-output 'keys_unsorted, map(.[0]) , map(.[1]), map(.[2]) |@csv'
Run Code Online (Sandbox Code Playgroud)

给了我我想要的,例如上面的 3 个数组成员。但是我怎样才能让它工作以解决更大(未知)数量的数组元素呢?

pea*_*eak 6

事实上,使用transpose可以按照您的设想提供一种简单的单行解决方案:

( keys_unsorted, ([.[]] | transpose)[]) | @csv
Run Code Online (Sandbox Code Playgroud)

使用示例数据,使用 -r 选项调用 jq 会产生:

"latitude","longitude","drivingDifficultyIndex","iconCode","observationTimeUtcIso","precip1Hour"
39.582,26.675,0,31,"2016-06-26T00:20:00+0000",0
39.582,26.675,34,11,"2016-06-26T01:20:00+0000",0.1
39.582,26.675,34,11,"2016-06-26T02:20:00+0000",0.5
Run Code Online (Sandbox Code Playgroud)