代码之家  ›  专栏  ›  技术社区  ›  WeatherBadger

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

  •  1
  • WeatherBadger  · 技术社区  · 7 年前

    我试图使用jq将JSON输出转换为CSV。

    这里是输入。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]
    }
    

    迄今为止,我的最佳尝试是:

    jq --raw-output 'keys , .[] | @csv'
    

    这使得

    "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
    

    How to convert arbirtrary simple JSON to CSV using 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
    

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

    有人能帮jq生产出我想要的产品吗?

    谢谢

    更新:

    jq --raw-output 'keys_unsorted, map(.[0]) , map(.[1]), map(.[2]) |@csv'
    

    给出了我想要的,例如上面的3个数组成员。但是,我如何才能使其工作,以考虑到更大(未知)数量的数组元素?

    1 回复  |  直到 7 年前
        1
  •  4
  •   peak    7 年前

    实际上,使用 transpose 允许按照您的设想提供简单的单行解决方案:

    ( keys_unsorted, ([.[]] | transpose)[]) | @csv
    

    对于示例数据,使用-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