【问题标题】:Creating a CSV from json using jq, based on elements in array基于数组中的元素,使用 jq 从 json 创建 CSV
【发布时间】:2017-05-27 02:47:18
【问题描述】:

我有以下 json 格式需要转换为 CSV

[{
            "name": "joe",
            "age": 21,
            "skills": [{
                "lang": "spanish",
                "grade": "47",
                "school": {
                    "name": "my school",
                    "url": "example.com/sp-school"
                }
            }, {
                "lang": "english",
                "grade": "87"
            }]

        },

        {
            "name": "sarah",
            "age": 34,
            "skills": [{
                "lang": "french",
                "grade": "47",
                "school": {
                    "name": "my school",
                    "url": "example.com/sp-school"
                }
            }, {
                "lang": "english",
                "grade": "87"
            }]

        }, {
            "name": "jim",
            "age": 26,
            "skills": [{
                "lang": "spanish",
                "grade": "60"

            }, {
                "lang": "english",
                "grade": "66",
                "school": {
                    "name": "eg school",
                    "url": "eg-school.com"

                }
            }]

        }
    ]

转换为 csv

name,age,grade,school,url,file,line_number
joe,21,47,"my school","example.com/sp-school",sample.json,1
jim,26,60,"","",sample.json,3

如果 lang=spanish 则添加顶级字段和技能数组中的对象,如果存在西班牙语则添加技能对象中的学校哈希

我还想添加它来自的文件和行号。

我想使用 jq 来完成这项工作,但不知道语法,有人帮帮我吗?

【问题讨论】:

    标签: json csv jq


    【解决方案1】:

    在 input.json 中使用您的数据,在 tocsv.jq 中使用以下 jq 程序:

    .[]
    | [.name, .age] +
      (.skills[]
      | select(.lang == "spanish")
      | [.grade, .school.name, .school.url, input_filename, input_line_number] )
    | @csv
    

    调用:

    jq -r -f tocsv.jq  input.json
    

    产量:

    "joe",21,"47","my school","example.com/sp-school","input.json",51
    "jim",26,"60",,,"input.json",51
    

    如果您想将数值字符串转换为数字,您可以使用“tonumber”过滤器。如果您希望用字符串替换空值字段,请使用例如.school.name // ""

    当然,这种方法不会产生非常有用的行号。一种会产生更高粒度的方法是将单个对象流式传输到 jq 中,但是您会丢失文件名。要恢复文件名,您可以将其作为参数传递。所以你会有一个像这样的管道:

    jq -c '.[]' input.json | jq -r --arg file input.json -f tocsv2.jq
    

    tocsv2.jq 与上面的 tscsv.jq 类似,但没有初始 .[] |,并且使用 $file 而不是 input_filename

    最后,还请考虑使用 TSV 格式 (@tsv),而不是比较凌乱的 CSV 格式 (@csv)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多