Вывести пустую строку для отсутствующего ключа и преобразовать результат в CSV - PullRequest
2 голосов
/ 29 января 2020

Я пытаюсь преобразовать ниже JSON в CSV с помощью команды jq, но последний CSV не может правильно разместить поле deviceName, так как оно отсутствует в некоторых JSON строках.

{
  "id": "ABC",
  "deviceName": "",
  "total": 100,
  "master": 20
}
{
  "id": "ABC",
  "total": 100,
  "master": 20
}

Как я могу сделать так, чтобы пустое значение получалось при отсутствии ключа? 1016 * это смещение ячейки влево.

"ABC","",100,20
"ABC",100,20

Я хочу вывести что-то вроде ниже, которое добавляет пустое значение, если имя устройства отсутствует.

"ABC","",100,20
"ABC","",100,20

Ответы [ 2 ]

3 голосов
/ 29 января 2020

В jq вы можете использовать альтернативный оператор //, который можно использовать для возврата значений по умолчанию. Например, .foo // 1 будет иметь значение 1, если во входе нет элемента .foo

. Используя это и добавляя пустую строку "", если ключ отсутствует, вы можете сделать

jq -r '[.id // "", .deviceName // "", .total // "", .master // ""] | @csv'

Примечание : альтернативный оператор .foo // 1 приводит к вычислению 1 для случая, когда значение foo равно null или false. Вы можете sh изменить вышеуказанную программу, если ваши данные содержат значения null или false.

2 голосов
/ 29 января 2020

Вы можете взять первый объект в качестве ссылки для полной записи, например

keys_unsorted as $k | (., inputs) | [.[$k[]]] | @csv

. Для вашего примера это выдает следующее:

"ABC","",100,20
"ABC",,100,20
...