CSV в JSON на MacOS Sequoia 15.2 через JQ и CSVKIT
Обычно для быстрой конвертации 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