Вернуть пустую строку или 0 (ноль) в случае отсутствия ключа с помощью jq - PullRequest
0 голосов
/ 22 октября 2018

У меня проблемы с преобразованием json в csv.

У меня есть файл json этой структуры:

{
    "key": [
        {
            "key1": 1,
            "key2": 1,
            "key3": {
                "1": 1,
                "2": 2,
                "3": 3,
                "4": 4
            }
        },
        {
            "key1": 2,
            "key2": 2,
            "key3": {
                "2": 2
            }
        }
        ...
    ],
    ...
}

Я использовал этот вызов jq для преобразования моего json в csv:

bin\jq-win64 ".key[] | [.key1, .key2, .key3.\"1\", .key3.\"2\", .key3.\"3\", .key3.\"4\" ] | tostring] | join(\";\")" source.json > output.tmp

Я не могу использовать стандартный @csv, потому что это не подходит для моих настроек локали.Но вернемся к проблеме.В некоторых случаях key3 может не быть полным 4-элементным объектом (4 - максимум с ключами 1/2/3/4, как в примере).У меня есть проблема с этими отсутствующими подразделами, потому что jq возвращает «ноль», и это не очень хорошо работает с оценкой CSV в Excel или Calc.Есть ли способ заставить пустую строку или числовой 0 в качестве вывода в таком случае?

В конце концов, я могу попробовать использовать какой-нибудь другой текстовый процессор командной строки, но я был бы рад, если бы я мог сделать это содин инструмент.

РЕДАКТИРОВАТЬ: у меня был неправильный пример структуры json, и теперь реальная проблема немного изменилась.Сообщение обновлено.

1 Ответ

0 голосов
/ 22 октября 2018

Вы можете настроить свой конвейер, добавив

map(. // 0)

сразу после формирования массива.Если вы хотите сохранить false, вам нужно будет добавить

map(if . == null then 0 else . end)

.

Если вам нужно решение, не зависящее от имен ключей, вы можете использовать что-тостроки:

def resize($n): [range(0;$n) as $i | .[$i] // 0];

Это приведет к усечению или расширению входного массива.Если вы не хотите усекать, то подправьте соответственно.

...