CSV в JSON на MacOS Sequoia 15.2 через JQ и CSVKIT

05.01.2025

Обычно для быстрой конвертации CSV в JSON проще и быстрее воспользоваться онлайн-сервисами, например: csvjson.com.

Но если у Вас файл больше 5-10 MB и/или содержит больше 100 000 строк, то эта задача может показаться замороченной.

Чтобы избежать трудностей, я рекомендую установить 2 интересные библиотеки для решения задачи на Mac OS и довольно быстро: jq и csvkit

Работать будем локально в терминале.

Установим всё необходимое через пакетный менеджер Homebrew:

brew install jq csvkit

Далее заходим в папку в которой у нас лежит CSV-файл и выполняем

csvjson input.csv > output.json

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

Она позволяет парсить, фильтровать и преобразовывать JSON-данные с высокой гибкостью.

Например:

csvjson input.csv | jq '.' > output.json

Здесь jq принимает JSON данные (вывод команды csvjson) и обрабатывает их.

В случае c '.' просто выводит данные в формате JSON с красивым отступом (pretty print).

Это особенно полезно, если вы хотите сделать JSON читаемым или проверить его структуру.

Особенности

Иногда CSVKit чудит и превращает числовые поля "ID" и т.д. в значения с плавающей точкой (например, 42 превращается в 42.0).

Чтобы этого избежать, можно воспользоваться опцией --no-inference, которая позволит сохранить все данные как строки, а не преобразовывать их автоматически.

csvjson --no-inference input.csv | jq '.' > output.json

Стоит отметить, что и размер файла на выход будет больше, это нужно учесть.

Дополнительные возможности jq

jq может выполнять гораздо более сложные операции, например:

Фильтрация данных: Вывести только элементы, где поле age больше 30:

jq '.[] | select(.age > 30)' input.json

Изменение структуры JSON: Преобразовать JSON в новый формат, выбирая только определённые поля:

jq '[.[] | {name: .name, email: .email}]' input.json

Подсчёт элементов: Подсчитать количество записей в массиве:

jq 'length' input.json

Объединение или добавление данных: Добавить новое поле ко всем объектам:

jq '.[] | .newField = "value"' input.json