Как приручить хаос в таблицах прямо из терминала
Если вам регулярно присылают выгрузки данных, вы наверняка знаете эту боль. Файл на триста мегабайт, кодировка Windows-1251, разделитель где-то точка с запятой, где-то запятая, а внутри строк встречаются неэкранированные переносы. Открывать такое в Excel — верный способ подвесить офисный пакет намертво или случайно обрезать лидирующие нули в номерах телефонов. Писать ради быстрой проверки скрипт на Python с pandas тоже лень.
В таких ситуациях выручает csvkit — набор утилит командной строки для работы с табличными данными. Проект живет на GitHub с 2011 года, набрал больше 6400 звезд и до сих пор остается одним из самых удобных способов препарировать CSV прямо в bash.
Что умеет этот набор утилит
Создатели пакета, журналистское объединение Wire Services, вдохновлялись инструментами вроде pdftk и GDAL. Идея простая: дать разработчику и дата-аналитику набор специализированных команд под UNIX-пайплайны, чтобы чистить, резать, форматировать и исследовать табличные файлы без написания кода.
Утилиты разбиты по задачам: конвертация, нарезка, анализ и выполнение SQL-запросов.
Быстрый просмотр и базовая статистика
Команда csvlook превращает сырой CSV в аккуратную ASCII-таблицу с правильным выравниванием колонок. В сочетании с head или less получается отличный предпросмотр:
head -n 20 data.csv | csvlook
Если нужно понять структуру неизвестного файла, запускаем csvstat. Утилита анализирует типы данных в каждом столбце, находит пропуски, считает минимум, максимум, среднее значение и показывает список самых частых значений:
csvstat data.csv
Нарезка и фильтрация
Традиционные UNIX-утилиты вроде cut и grep часто ломаются на сложных CSV, когда внутри полей в кавычках встречаются запятые или переносы строк. В пакете есть специализированные аналоги:
csvcut вырезает нужные колонки по именам или номерам:
csvcut -c "user_id,email,status" users.csv > clean_users.csv
csvgrep фильтрует строки по значениям или регулярным выражениям:
csvgrep -c "status" -m "active" users.csv
SQL прямо поверх файлов
Одна из самых удобных команд — csvsql. Она умеет две вещи. Во-первых, генерирует DDL-схему для PostgreSQL, MySQL или SQLite на основе анализа типов данных в файле. Во-вторых, дает возможность писать SQL-запросы прямо к CSV-файлам на диске через встроенный SQLite:
csvsql --query "select status, count(*) from users group by status" users.csv
При этом можно джойнить между собой два разных файла так, будто это обычные таблицы в базе данных:
csvsql --query "select u.name, o.total from users u join orders o on u.id = o.user_id" users.csv orders.csv
Конвертация форматов
Инструмент in2csv переводит в CSV практически всё: файлы Excel (.xls и .xlsx), JSON, NDJSON и фиксированную ширину (fixed-width). Больше не нужно запускать Excel, чтобы пересохранить присланный отчет:
in2csv report.xlsx --sheet "Sales" > sales.csv
Как это устроено внутри
Пакет написан на Python и распространяется через PyPI. Для работы с базами данных используется SQLAlchemy, что объясняет гибкость csvsql при работе с разными диалектами SQL.
Главный плюс архитектуры — совместимость со стандартным вводом и выводом (stdin/stdout). Команды легко связываются через обычный пайп:
in2csv data.xlsx | csvgrep -c "country" -m "RU" | csvcut -c 1,3,5 | csvlook
У такого подхода есть и обратная сторона. Поскольку библиотека написана на чистом Python с проверкой типов на лету, на файлах размером в несколько гигабайт скорость работы падает. Для терабайтных выгрузок лучше взять xsv на Rust или duckdb, но для повседневных задач до пары сотен мегабайт скорости csvkit хватает с головой.
Где это пригодится на практике
- Проверка структуры данных на удаленном сервере без GUI.
- Предварительная очистка файлов в bash-скриптах перед загрузкой в ETL-пайплайн.
- Генерация схемы таблиц базы данных под новую выгрузку (
csvsql -i postgresql data.csv). - Быстрое объединение двух разрозненных файлов по общему ключу через
csvjoin.
Стоит ли ставить
Устанавливается пакет одной командой через pip:
pip install csvkit
Если вы часто разбираете логи, работаете с импортом баз данных или получаете отчеты в виде архивов с Excel и CSV, этот набор утилит сбережет кучу нервов. Он избавляет от необходимости открывать тяжелый редактор или писать одноразовые скрипты ради элементарной фильтрации двух колонок. Начните с csvlook и in2csv — они окупают установку в первые пять минут использования.
