Как объединить значения из разных объектов JSON в одну строку CSV, используя jq - PullRequest
1 голос
/ 25 июня 2019

Я хочу извлечь данные из файла JSON и записать их в файл CSV, используя .

Это образец моих данных:

[
  {
    "media": {
      "track": [
        {
          "attype": "General",
          "FileExtension": "MP4",
          "Format": "MPEG-4"
        },
        {
          "attype": "Video",
          "Format": "MPEG Video"
        }
      ]
    }
  },
  {
    "media": {
      "track": [
        {
          "attype": "General",
          "FileExtension": "ts",
          "Format": "MPEG-TS"
        },
        {
          "attype": "Video",
          "Format": "MPEG Video"
        }
      ]
    }
  }
]

Это желаемый результат:

"MP4","MPEG-4","MPEG Video"
"ts","MPEG-TS","MPEG Video"

Это мой код:

.[].media.track[] |
  [
    (select(.attype =="General") | .FileExtension, .Format),
    (select(.attype =="Video") | .Format)
  ] | @csv

Это фактический результат:

"MP4","MPEG-4"
"MPEG Video"
"ts","MPEG-TS"
"MPEG Video"

Я экспериментировал с фильтром flatten и с различным использованием квадратных скобок [] для построения массива, но безрезультатно. Как я могу достичь желаемого результата с ?

Ответы [ 2 ]

4 голосов
/ 25 июня 2019

Вы на правильном пути (каламбур) - вам просто нужно расширить .track следующим образом:

.[].media.track
| [.[]
   | (select(.attype =="General") | .FileExtension, .Format),
     (select(.attype =="Video") | .Format) ]
| @csv

В качестве альтернативы ...

Если вы найдете все этискобки и скобки слишком отвлекают, вы можете добавить:

.[].media.track
| map( if .attype =="General" then .FileExtension, .Format
       elif .attype =="Video" then .Format
       else empty
       end )
| @csv
3 голосов
/ 25 июня 2019

Решение состоит в том, чтобы создать массив ячеек для каждого носителя, а не для каждой дорожки:

.[].media | 
  [ 
    .track[] |
       (select(.attype =="General") | .FileExtension, .Format),
       (select(.attype =="Video") | .Format)
  ] | @csv
...