2015-08-19 4 views
3

входаПреобразования карты JSon в формат CSV с помощью JQ

{"key1": ["value1", "value2"], "key2": ["value3"]} 

Желаемой выход

key1, value1 
key1, value2 
key2, value3 

трудного времени выяснить, JQ команду для достижения этой цели ... Я попытался карта, так как, to_entries фильтров в разных комбинациях, но не повезло.

ответ

3

Я удалил дополнительную пару кронштейнов вокруг вашего объекта JSON, чтобы сделать его действительным JSON. Так, начиная с этого:

{ 
    "key1": [ "value1", "value2" ], 
    "key2": [ "value3" ] 
} 

Мы применяем to_entries, который дает нам это:

[ 
    { 
    "key": "key1", 
    "value": [ "value1", "value2" ] 
    }, 
    { 
    "key": "key2", 
    "value": [ "value3" ] 
    } 
] 

Затем мы map каждый из этих записей и выкладываем ([]) в .value массив, создавая отдельный объект для каждого из его элементов (map({key, value: .value[]})). Это дает нам:

[ 
    { 
    "key": "key1", 
    "value": "value1" 
    }, 
    { 
    "key": "key1", 
    "value": "value2" 
    }, 
    { 
    "key": "key2", 
    "value": "value3" 
    } 
] 

После этого, для каждого из этих объектов, мы хотим, чтобы массив с его значениями, так как это то, что ожидает @csv фильтр. Это просто отображение на объект массива, как в map([.key, .value]), что дает нам:

[ 
    [ "key1", "value1" ], 
    [ "key1", "value2" ], 
    [ "key2", "value3" ] 
] 

И, наконец, мы распространяем ([]) массив массивов (с @csv ожидает отдельных массивов), и мы трубу @csv к нему. Полный сценарий выглядит следующим образом:

jq -r 'to_entries | map({key, value: .value[]}) | map([.key, .value])[] | @csv' test.json 

и его выход:

"key1","value1" 
"key1","value2" 
"key2","value3" 
+0

Спасибо Сантьяго за пошаговое объяснение. Обновлен вопрос об удалении дополнительных скобок (был результатом того, что я пытался упростить ввод сообщения) –

2

Вы можете пропустить несколько шагов накапливались строки.

$ jq -r 'to_entries[] | { key, value: .value[] } | [ .key, .value ] | @csv' 

В JQ 1.5 вы можете использовать новый combinations фильтр для создания комбинаций ключей и значений.

$ jq -r 'to_entries[] | [ [.key], .value ] | combinations | @csv' 
0

Вот краткое решение с использованием только JQ-х [] оператора и \() интерполяцию строки. Используйте вместе с флагом jq -r, чтобы избежать дополнительных кавычек в конечном выпуске.

. as $v 
| keys[] 
| "\(.), \($v[.][])" 
Смежные вопросы