Json на вопросы CSV - PullRequest
       20

Json на вопросы CSV

1 голос
/ 13 марта 2020

Я использую pandas для нормализации некоторых json данных. Я застреваю в этой проблеме, когда более 1 раздела является либо объектом, либо массивом.

Если я использую record_path на Car, он прерывается на втором.

Есть ли какие-нибудь указатели о том, как получить что-то подобное для создания строки в CSV для каждого автомобиля и для каждого местоположения?

[
    {
        "Name": "John Doe",
        "Car": [
            "Car1",
            "Car2"
        ],
        "Location": "Texas"
    },
    {
        "Name": "Jane Roe",
        "Car": "Car1",            
        "Location": [
            "Illinois",
            "Kansas"
        ]
    }
]

Вот вывод

Name,Car,Location
John Doe,"['Car1', 'Car2']",Texas
Jane Roe,Car1,"['Illinois', 'Kansas']"

Вот код:

with open('file.json') as data_file:
    data = json.load(data_file)
df = pd.io.json.json_normalize(data, errors='ignore')

Хотелось бы, чтобы все закончилось так:

Name,Car,Location
John Doe,Car1,Texas
John Doe,Car2,Texas
Jane Roe,Car1,Illinois
Jane Roe,Car1,Kansas

Ответы работали великолепно, пока я не наткнулся на файл json с дополнительными данными. Вот как выглядит файл с дополнительными значениями.

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

Вот что я собираюсь сделать. Я думаю, что это наиболее читаемый в этом формате, но что-нибудь по крайней мере, если все ключи

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,

Есть какие-нибудь предложения по получению этой второй части?

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Простое решение jq, которое также более обобщенно c, чем необходимо здесь:

["Name", "Car", "Location"],
(.[]
 | [.Name] + (.Car|..|scalars|[.]) + (.Location|..|scalars|[.]))
| @csv
0 голосов
/ 13 марта 2020

Вы ищете что-то вроде этого:

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

REPL демо

...