首页 > 解决方案 > JQ 到 CSV 问题

问题描述

我以前在这里得到了一些关于 jq 到 csv 问题的帮助。我遇到了一个问题,其中一些 json 文件有一些额外的值会破坏 jq 命令

这是json数据。修复部分是破坏 jq 命令的原因

[
    {
        "Name": "John Doe",
        "Car": [
            "Car1",
            "Car2"
        ],
        "Location": "Texas",
        "Repairs: {
            "RepairLocations": {
                "RepairsCompleted":[
                    "Fix1",
                    "Fix2"
                ]
            }
        }
    },
    {
        "Name": "Jane Roe",
        "Car": "Car1",            
        "Location": [
            "Illinois",
            "Kansas"
        ]
    }
]

这是命令

def expand($keys):
    . as $in
    | reduce $keys[] as $k ( [{}];
        map(. + { 
            ($k): ($in[$k] | if type == "array" then .[] else . end)
        })
    ) | .[];
(.[0] | keys_unsorted) as $h
| $h, (.[] | expand($h) | [.[$h[]]]) | @csv

这是我想要得到的最终结果。该数据不是实际数据。

Name,Car,Location,Repairs:RepairLocation
John Doe,Car1,Texas,RepairsCompleted:Fix1
John Doe,Car1,Texas,RepairsCompleted:Fix2
John Doe,Car2,Texas,RepairsCompleted:Fix1
John Doe,Car2,Texas,RepairsCompleted:Fix2
Jane Roe,Car1,Illinois,
Jane Roe,Car1,Kansas,

对此的任何建议都会很棒。我正在努力弄清楚 jq

标签: jsonexport-to-csvjq

解决方案


可以使用您已经提出的类似问题的答案之一中所示的相同技术获得一个简单的解决方案。唯一的区别是在“修复”键不存在的情况下满足您的要求:

["Name", "Car", "Location", "Repairs:RepairLocation"],
(.[]
 | [.Name]
    + (.Car|..|scalars|[.])
    + (.Location|..|scalars|[.])
    + (.Repairs|..|scalars
       | [if . == null then . else "RepairsCompleted:\(.)" end]) )
| @csv

使用辅助函数避免重复

def s: .. | scalars | [.];
["Name", "Car", "Location", "Repairs:RepairLocation"],
(.[]
 | [.Name] 
    + (.Car|s)
    + (.Location|s) 
    + (.Repairs|s|map(if . == null then . else "RepairsCompleted:\(.)" end)))
| @csv

推荐阅读