Разбор файла JSON и преобразование в файл csv с использованием jq - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь проанализировать свои данные и преобразовать их в несколько csv файлов, в соответствии с разделом.

Образец JSON

{
    "content": [
    {
        "Title": "abc",
        "brand": "xyz",
        "size": "5 g",
        "date": "2019-01-01",
        "details": {
            "Temperature": [
            {
                "value": "90",
                "chracterstics":"Normal"
            },
            {
                "value":"100",
                "chracterstics":"high"
            },

            {
                "value":"80",
                "chracterstics":"low"
            }
            ],

            "certifications": [
            {
                "value": "based",
                "chracterstics":"pass"
            },

            {
                "value": "50",
                "chracterstics":"failed"
            }
            ]
        },

         "formats": {
            "city": "NYC",
            "id": "007",
            "manufacture":""
            },
        "innerDetails": [
        {
            "contains": "abc",
            "panel":"xyz",
            "values":[
                {
                    "name":"abc",
                    "value":"10"
                },
                {
                    "name":"xyz",
                    "value":"20"
                }
                ]
            }
        ]
}
]
}

Я пытаюсь поместить данные содержимого в один файл csv , Данные о температуре во второй файл csv , сертификатыв-третьих, форматирует и данные внутренних деталей в другом отдельном файле.

Я попробовал следующий подход, но получаю ошибку «Не удается индексировать массив со строкой« brand »».

jq -r '.[]|[.Title,.brand,.size,.date]|@csv' $jsonfile > sample.csv.

Iпытался выполнить ту же строку с другими разделами, но получал ту же ошибку.

Как мне решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

Для простоты лучше всего обрабатывать каждый набор данных в отдельном вызове jq.Это кажется разумным, учитывая, что каждый вызов jq довольно быстрый, и кажется, что вам понадобится только небольшое количество таких вызовов.

Данные о температуре и сертификации единообразны на входе JSON и поэтому могут обрабатываться.в цикле, таком как:

for field in Temperature certifications ; do
    echo $field ::
    jq --arg field "$field" -r '
      .content[].details | .[$field][]
      | [.value, .characteristics] | @csv' input.json > output.$field.csv
done    

(Это, конечно, предполагает, что JSON действителен и что «сертификаты» написаны правильно.)

Добавление столбцов, специфичных для «содержимого»

for field in Temperature certifications ; do
    echo $field ::
    jq --arg field "$field" -r '.content[]
      | [.Title, .brand] as $columns
      | .details | .[$field][]
      | ($columns + [.value, .characteristics]) | @csv
    ' so-multiple-csv-files.json > tmp.output.$field.csv
done    
0 голосов
/ 16 марта 2019

Использовать карту:

$jq -r '.[] | map(.Title), map(.brand), map(.size), map(.date) | @csv' yourfile.json > sample.csv

...