невозможно проанализировать JSON в CSV с помощью JQ - PullRequest
0 голосов
/ 25 октября 2019

У меня есть файл JSON, который я хочу преобразовать в файл CSV, используя jq в сценарии оболочки. Я хочу создать одну строку из всего этого файла JSON. Я должен извлечь ценность из ценностей. Вывод строки должен быть примерно таким:

null, 642,642,412,0, null, null

Here is my JSON file

{
     "data": [
   {
     "name": "exits",
     "period": "lifetime",
     "values": [
       {
         "value": {}
       }
     ],
     "title": "Exits",
     "description": "Number of times someone exited the carousel"
   },
   {
     "name": "impressions",
     "period": "lifetime",
     "values": [
       {
         "value": 642
       }
     ],
     "title": "Impressions",
     "description": "Total number of times the media object has been seen"
   },
   {
     "name": "reach",
     "period": "lifetime",
     "values": [
       {
         "value": 412
       }
     ],
     "title": "Reach",
     "description": "Total number of unique accounts that have seen the media object"
   },
   {
     "name": "replies",
     "period": "lifetime",
     "values": [
       {
         "value": 0
       }
     ],
     "title": "Replies",
     "description": "Total number of replies to the carousel"
   },
   {
     "name": "taps_forward",
     "period": "lifetime",
     "values": [
       {
         "value": {}
       }
     ],
     "title": "Taps Forward",
     "description": "Total number of taps to see this story's next photo or video"
   },
   {
     "name": "taps_back",
     "period": "lifetime",
     "values": [
       {
         "value": {}
       }
     ],
     "title": "Taps Back",
     "description": "Total number of taps to see this story's previous photo or video"
   }
 ]
}

Привет попытался с помощью этой команды jq: .data | map(.values[].value) | @csv

Это дает следующий вывод: jq: error (at: 70): объект ({}) недопустим в состоянии выхода строки CSV 5

Так что, когда я получаю это пустоеJSON объект отражает ошибку.

Пожалуйста, помогите !!

Вывод строки должен выглядеть примерно так:

null, 642 642 412,0, null, null

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

Использование length==0 в лучшем случае сомнительно. Для проверки {} можно написать:

jq '.data | map(.values[].value | if . == {} then "null" else . end) | @csv'

Аналогично для [].

2 голосов
/ 25 октября 2019

Если вы запустите команду без части @csv, вы увидите, что результат будет:

[
  {},
  642,
  412,
  0,
  {},
  {}
]

Заменив пустые объекты на «null»: (length == 0)

jq '.data | map(.values[].value) | map(if (type == "object" and length == 0 ) then "null" else . end) | @csv'

Output:
"\"null\",642,412,0,\"null\",\"null\""

По предложению @aaron (см. Комментарий). Следующее может произвести запрошенный вывод без дополнительной постобработки. Отказ от ответственности: это не работает с моим jq 1.5, но работает на jqplay с jq 1.6.

jq --raw-output '.data | map(.values[].value) | map(if (type == "object" and length == 0 ) then "null" else . end) | join(",")'

Output:
null,642,412,0,null,null
...