Json到CSV转换并将值作为标题

时间:2019-08-02 18:41:24

标签: json shell csv jq

我有一个下面的JSON文件,需要转换为带有一些值的CSV文件作为标题,在下面的值应填充。下面是示例json

{
  "environments" : [ {
    "dimensions" : [ {
      "metrics" : [ {
        "name" : "count",
        "values" : [ "123" ]
      }, {
        "name" : "response_time",
        "values" : [ "15.7" ]
      }],
      "name" : "abcd"
    }, {
      "metrics" : [ {
        "name" : "count",
        "values" : [ "456" ]
      }, {
        "name" : "response_time",
        "values" : [ "18.7" ]
      }],
      "name" : "xyzz"
    }

这是我已经尝试过的

jq -r '.environments[].dimensions[] | .name as $p_name | .metrics[] | .name as $val_name | if $val_name == "response_time" then ($p_name,$val_name, .values[])' input.json

预期为

name,count,response_time
abcd, 123, 15.7
xyzz, 456, 18.7

2 个答案:

答案 0 :(得分:1)

生成标头很容易,因此我将集中于生成其余CSV。

以下内容的优点是简单明了,并且希望至少在准备好jq手册的情况下可以不言自明。接下来是针对效率的调整。

jq -r '
  # name,count,response_time
  .environments[].dimensions[]
  | .name as $p_name
  | .metrics
  | [$p_name]
    + map(select(.name == "count") | .values[0] )
    + map(select(.name == "response_time") | .values[0] )
  | @csv
'

效率

这是上面的一种变体,如果.metrics数组中包含大量项目,则将是合适的:

jq -r '
  # name,count,response_time
  .environments[].dimensions[]
  | .name as $p_name
  | INDEX(.metrics[]; .name) as $dict
  | [$p_name, $dict["count"].values[0], $dict["response_time"].values[0]]
  | @csv
'

答案 1 :(得分:1)

如果目标是依靠JSON本身以“ metrics”数组显示标题的顺序提供标题名称, 然后考虑:

.environments[].dimensions
| ["name", (.[0] | .metrics[] | .name)],     # first emit the headers
  ( .[] | [.name, (.metrics[].values[0])] )  # ... and then the data rows
| @csv