Как преобразовать JSON в CSV с помощью jq в командной строке

1656538929 kak preobrazovat json v csv s pomoshhyu jq v komandnoj

Кнут Мельвер

uEldd4kqrxZya-E2YYIxA25iQ3kuuBFtq1Gr

Инструмент оболочки 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'.

RS3kI4oS3QmUl6XYU0JWUst09IJGXi2oLJFd
Выход из sanity.io передается через jq

Так что если вы хотите иметь документы такого типа postВы ставите $ sanity documents query '*[_type == "post"]'. Или если вы просто хотите, чтобы дата публикации была в 2018 году, это так$ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01«]». Этот запрос дает вам целые документы. Если вам нужны только названия и даты публикации, вы бы написалиe: *[_type == "post"]{title, publishedAt}.

isYCXU3wUsZ9ucMhJyY1CRYaPjmSIeX66y8B
Выход из Sanity CLI передается через jq

Вы можете выбрать ключи и значения из данных 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-выражение:

  • -r для --raw-ouput и убедится, что на выходе будет обычный старый скучный текст без цвета или специального форматирования.
  • (map(keys) | add | unique) as $cols повторяет (map) с помощью ключей в вашем объекте и addс unique единиц к переменной под названием $cols. Другими словами, так создаются заголовки ваших столбцов.
e6sn55BOmzgF2Zkd1DW510oi4vLKhnSQVAjw
Определите уникальные ключи для использования в качестве заголовков столбцов
  • map(. as $row | $cols | map($row[.])) as $rows берет все объекты наружного массива и перебирает все ключи объектов (title, slug, publishedAt). Он добавляет значение к массиву, который дает вам массив массивов со значениями, которые вам нужно, когда вы преобразуете JSON в CSV.
  • $cols, $rows[] | @csv помещает заголовки столбцов сначала в массив, а затем каждый из массивов, которые превращаются в строки путем передачи их в массив @csv форматирующий выход как… csv.
TjZbfS7LCA033RdEiJ45l5-qBGIeQyVG9tAF
Конечный результат

Эта команда выводит результат в оболочку. Если вы хотите записать его непосредственно в файл, вы можете добавить > filename.csv к нему или, например, в буфер обмена (перевести его to | pbcopy если у вас macOS). Или, возможно, вы сделаете что-то захватывающее из csv в pandas?? на Python?

Если вы нашли это полезно, мы будем рады услышать все об этом в разделе комментариев!

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

Первоначально опубликовано на sanity.io.

Добавить комментарий

Ваш адрес email не будет опубликован.