
Інструмент оболонки 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, published
At}.

Ви також можете вибрати ключі та значення з даних 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
) через ключі у вашому об’єкті таadd
sunique
до змінної, що називається$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.