LINUX.ORG.RU

json array в csv

 , , , ,


0

2

Всем привет.

Есть у меня json, примерно вида:

{
    "Array1": [
            {
                "key1": "some string",
                "key2": "another string",
                "Array2": [
                    {
                        "key3": "int",
                        "Array3": [],
                        "Array4": [],
                        "Array5": [],
                        "Array6": [
                            {
                                "key4": "one more string",
                                "key5": "last string"
                            }
                        ]
                    }
                ]
            }
        ]
}

Сейчас я забираю с такого json только значения key1 и key2 при помощи jq и формирую csv примерно так

cat tmpl.jq

.Array1[]|{
    "One":.key1,
    "Two":.key2
}|join("&")

После чего могу открыть данную csv и получить красивый spreadsheet разбив по &. Получается два столбика со значениями.

Теперь я хочу добавить третий столбец, но с содержимым всего Array2, со всеми значениями и массивами внутри. Так что бы в spreadsheet у меня все содержимое Array2 умещалось в одну ячейку.

Таким образом я хочу получить нечто подобное:

|---------------------|---------------------|--------------------------------------------|
|         One         |         Two         |                     Three                  |
|---------------------|---------------------|--------------------------------------------|
| some string         | another string      | {                                          |
|                     |                     | "key3": "int",                             |
|                     |                     | "Array3": [],                              |
|                     |                     | "Array4": [],                              |
|                     |                     | "Array5": [],                              |
|                     |                     | "Array6": [                                |
|                     |                     |     {                                      |
|                     |                     |         "key4": "one more string",         |
|                     |                     |         "key5": "last string"              |
|                     |                     |     }                                      |
|                     |                     | ]                                          |
|                     |                     |}                                           |
|---------------------|---------------------|--------------------------------------------|
Можно ли как-то это сделать красиво?

Спасибо.



Последнее исправление: Linuxman (всего исправлений: 1)

Можно ли как-то это сделать красиво?

Да, использовать подходящие инструменты, например пистон.

anonymous
()

Есть два типа файлов, не надо их путать.

  1. данные в столбцах, разделённые символом (DSV, https://en.wikipedia.org/wiki/Delimiter-separated_values ). Это стандартный юниксовый стиль файлов. Символом часто выбирают TAB и тогда формат называется https://ru.wikipedia.org/wiki/TSV, хотя например в /etc/passwd используется :. Нюанс в том, что символ-разделитель (а также перевод строки) никак никогда не может использоваться внутри данных.

  2. CSV - https://ru.wikipedia.org/wiki/CSV - это сравнительно сложный формат с несколькими способами закавычивать данные, делать вложенные кавычки и т.д.

Сформировать его, впрочем, не так сложно, как парсить, в твоём случае надо удвоить кавычки "->"" и каждое поле заключить в такие же двойные кавычки. Получится вот такое уродство:

"some string","another string","                    {
                        ""key3"": ""int"",
                        ""Array3"": [],
                        ""Array4"": [],
                        ""Array5"": [],
                        ""Array6"": [
                            {
                                ""key4"": ""one more string"",
                                ""key5"": ""last string""
                            }
                        ]
                    }"

И, скажем, в экселе оно откроется, а awk’ом его уже не распарсишь.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)

Разве что что-то вроде этого:

.Array1[]|{
    "One":.key1,
    "Two":.key2,
    "Three":.Array2[]|tostring
}|join("&")

Но наверное лучше будет заюзать Питон

alx777 ★★
()
Ответ на: комментарий от Linuxman

Можно пример как это завернуть все на питоне?

Можно:

import json

json_str = '''
{
    "Array1": [
            {
                "key1": "some string",
                "key2": "another string",
                "Array2": [
                    {
                        "key3": "int",
                        "Array3": [],
                        "Array4": [],
                        "Array5": [],
                        "Array6": [
                            {
                                "key4": "one more string",
                                "key5": "last string"
                            }
                        ]
                    }
                ]
            }
        ]
}
'''

j = json.loads(json_str)

print("One&Two&Three")
for item in j["Array1"]:
  c1 = item["key1"]
  c2 = item["key2"]
  c3 = json.dumps(item["Array2"], indent=2).replace('\"', '\"\"')
  print("%s&%s&\"%s\"" % (c1, c2, c3))

alx777 ★★
()
Ответ на: комментарий от vodz

Спасибо, что без eval() :) Схоронил на всякий случай, хотя я с джейсоном стараюсь не связываться и обычно удаётся.

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.