【问题标题】:How to transform a complex,nested json into csv如何将复杂的嵌套 json 转换为 csv
【发布时间】:2019-07-20 17:07:20
【问题描述】:

这是输入的json

{
    "step": 1,
    "inputs": {
        "first_input": {
            "file_id": "xxx"
        }
        "second_input": 3
    }
}
{
    "step": 2,
    "inputs": {
        "my_first_arg": {
            "file_id": "yyy"
        }
        "my_second_arg": 0
    }
}

所需的 csv 文件是

1,first_input,"xxx"
1,second_input,3
2,my_first_arg:"yyy"
2,my_second_arg,0

这里的挑战是每个inputs 字段都包含一个具有不同键名和不同类型值的字典。基本上我想要step字段的值,inputs的所有键,inputs的值的子节点,但相关数据保持在csv的同一行。

【问题讨论】:

    标签: json csv command-line jq


    【解决方案1】:

    生成所需值的数组:

    .step as $step
    | .inputs
    | to_entries[]
    | .key as $key
    | [$step, .key]
      + (.value | if type=="object" then to_entries[] | [.key, .value] else [$key, .] end)
    

    最后添加@csv 将生成 CSV 值,其中数字不加引号。 使用 -r 命令行选项并对示例输入进行较小的更正会产生:

    1,"first_input","file_id","xxx"
    1,"second_input","second_input",3
    2,"my_first_arg","file_id","yyy"
    2,"my_second_arg","my_second_arg",0
    

    如果您确实想要 Q 中所示的输出,则在需要的位置有条件地添加引号 ("\""),并使用 join(",") 而不是 @csv

    【讨论】:

      【解决方案2】:

      考虑使用python和它的json模块来解析json,那么你几乎可以做任何你想做的事情。这是一个几乎可以满足您需求的示例。所以,我想说,让它完全按照你想要的方式吐出,改变它以从文件中加载 json,将 csv 输出从 StringIO 更改为实际文件,你就完成了。

      import json, csv, io
      
      json_str = '[{"step":1,"inputs":{"first_input":{"file_id":"xxx"},"second_input":3}},{"step":2,"inputs":{"my_first_arg":{"file_id":"yyy"},"my_second_arg":0}}]'
      
      def value(jsn):
          if not isinstance(jsn, dict):
              return jsn
          return next(iter(jsn))
      
      jsndata = json.loads(json_str)
      csvdata = io.StringIO()
      csvwriter = csv.writer(csvdata)
      for i in jsndata:
          step = i['step']
          for key in i['inputs']:
              val = value(i['inputs'][key])
              csvwriter.writerow([step, key, val]);
      
      print(csvdata.getvalue())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-29
        • 2019-12-20
        • 2021-10-21
        • 1970-01-01
        • 2018-01-07
        • 2020-10-28
        • 1970-01-01
        相关资源
        最近更新 更多