JQ для CSV вопросов - PullRequest
       13

JQ для CSV вопросов

4 голосов
/ 17 марта 2020

Ранее я получил некоторую помощь по некоторым вопросам jq to 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

1 Ответ

3 голосов
/ 17 марта 2020

Простое решение можно получить, используя ту же технику, которая показана в одном из ответов на аналогичный вопрос, который вы уже задали . Единственное отличие заключается в выполнении ваших требований в случае, если ключ «Ремонт» не существует:

["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
...