Як перетворити JSON у CSV за допомогою jq у командному рядку

Інструмент оболонки jq чудовий для роботи з JSON-даними. Він також може перетворити ці дані у зручні CSV-файли, готові для всіх ваших потреб у електронній таблиці.

jqце чудовий маленький інструмент, який живе у вашому терміналі та робить корисні речі з JSON-даними. Це потужний інструмент, але зручний і для дрібниць. Наприклад, якщо ви передаєте до нього дані JSON, він друкує їх із підсвічуванням синтаксису? за замовчуванням:

$ cat some-data.json|jq

Ви можете встановити jq на більшості систем. ( brew install jqна Mac з домоволодінням / chocolatey install jqна вікнах з шоколадним). У цій публікації представлена ​​більш досконала jqтехніка. Якщо ви хочете отримати основи, вам слід ознайомитися з підручником.

jqпрацює з будь-яким джерелом JSON. Оскільки більшу частину своїх днів я проводжу, працюючи з бэкендами на основі Sanity.io, я буду використовувати це як приклад. Також тому, що я думаю, що це надзвичайно круто, що ми можемо зробити з цією комбінацією.

Sanity є бекендом для структурованого вмісту і постачається з API у реальному часі та мовою запитів під назвою GROQ. Ви можете взаємодіяти з Sanity за допомогою HTTP та JS / PHP клієнтів, а також за допомогою інструмента CLI з $ sanity documents query 'GROQ-expression'.

Отже, якщо вам потрібні ваші документи такого типу post, ви ставите $ sanity documents query '*[_type == "post"]'. Або якщо вам потрібні лише ті, що мають дату публікації у 2018 році, це $ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01"]". Цей запит дає вам цілі документи. Якщо ви просто хотіли назви та дати публікації, ви б написали e: *[_type == "post"]{title, publishedAt}.

Ви також можете вибрати ключі та значення з даних JSON jq. Сьогодні ми будемо використовувати його для перетворення структурованого вмісту в масиві JSON у файл CSV. Оскільки ваш начальник хоче речі в аркушах Excel, так? Сиди міцно, і давайте зануримось! ? ‍

Скажімо, вам потрібен список назв ваших записів у блозі, слизняків та дати публікації у таблиці. Весь вираз виглядав би так:

sanity documents query '*[_type == "post"]{title, "slug": slug.current, publishedAt}'|jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

Ви можете скопіювати це і запустити з ним або пограти з ним на jqplay.com, але давайте подивимось, що відбувається в jq-expression:

  • -rє для --raw-ouputі гарантує, що на виході буде звичайний старий нудний текст без кольорів або спеціального форматування.
  • (map(keys) | add | unique) as $colsперебирає ( map) через ключі у вашому об’єкті та adds uniqueдо змінної, що називається $cols. Іншими словами, так створюються заголовки стовпців.
  • map(. as $row | $cols | map($row[.])) as $rowsприймає всі об'єкти у зовнішньому масиві та перебирає всі ключі об'єкта (title, slug, publishedAt). Він додає значення до масиву, що дає вам масив масивів зі значеннями, що є тим, що ви хочете, коли перетворюєте JSON у CSV.
  • $cols, $rows[] | @csvставить заголовки стовпців спочатку в масив, а потім кожен із масивів, які перетворюються на рядки, перекладаючи їх у @csv, що форматує вихідні дані як ... csv.

Ця команда друкує результат у оболонці. Якщо ви хочете записати його безпосередньо у файл, ви можете додати > filename.CSV до нього, або, наприклад, до буфера обміну (створити його, to | pbcякщо ви використовуєте macOS). Або, можливо, ви зробите щось захоплююче з csv у пандах ?? в Python?

Якщо ви вважаєте це корисним, ми хотіли б почути все про це в розділі коментарів!

Якщо ви хочете спробувати Sanity.io, ви можете перейти до sanity.io/freecodecamp і отримати оновлений безкоштовний план розробника. ✨

Спочатку опубліковано на сайті sanity.io.