Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 10, 2016 11:29:59

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Json в csv

Необходимо из файла json выдрать названия всех вершин и вывести их в определенном виде в csv.
Например:
Имеем такой файл

{
"dataset": [
{
"id":
{
"$oid": "asd1dad333fgdg5wg2"
},
"theme": "all",
"publisher": {
"name": "ORNL_DAAC",
"subOrganizationOf": {
"name": "National Aeronautics and Space Administration",
"subOrganizationOf": {
"name": "U.S. Government"
}
}
}
},
{
"id":
{
"$oid": "sd2g54g548kd"
},
"publisher": {
"name": "ORN_AAC",
"subOrganizationOf": {
"name": "DPUI"
}
}
}
]
}
результат должен быть в виде строки, где в каждой ячейке должна быть запись такого вида:
"id/$oid", "publisher/name", "publisher/subOrganizationOf/name", "publisher/subOrganizationOf/subOrganizationOf/name"
Вывести все уникальные записи не сложно, сложно сделать в таком виде.
Проблема в том, что структура каждого блока отличается. Идея в том, чтобы обойти каждый блок и сохранить уникальную запись в список, который потом уже и выводить в csv. На текущий момент не получается обойти эти блоки, да и записи то вывести тоже, поэтому вопрос - это вообще возможно? Или же json должен быть структурирован одинаково? Копал в сторону обхода дерева в глубину, но адаптировать не получается.

Отредактировано Firik (Фев. 10, 2016 11:30:59)

Офлайн

#2 Фев. 10, 2016 11:40:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Json в csv

Рекурсивный обход дерева, покажите ваш код который не получается.



Офлайн

#3 Фев. 10, 2016 12:00:07

Firik
Зарегистрирован: 2015-12-02
Сообщения: 151
Репутация: +  6  -
Профиль   Отправить e-mail  

Json в csv

Пробовал разобрать хотя бы первый блок, вывод неверный.

def get_first_row(input_object):
    global res_string
    if not isinstance(input_object, basestring):
        for x in input_object:
            res_string.append(x)
            if isinstance(input_object[x], basestring):
                break
            for y in input_object[x]:
                res_string.append(y)
                if isinstance(input_object[x][y], dict):
                    get_first_row(input_object[x][y])
                elif isinstance(input_object[x][y], basestring):
                    headers.append("/".join(res_string))
                    res_string = []
                    break
    else:
        headers.append(input_object)
    return sorted(headers)
Должно вывести как раз то, что в первом посте написал. Но выводит
"publisher/subOrganizationOf/subOrganizationOf/name", "name/name"
Запутался напрочь

Отредактировано Firik (Фев. 10, 2016 12:01:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version