![](https://habrastorage.org/webt/r2/3b/-u/r23b-ui4ymbcto9uyy-vzm7ajxa.png)
Привет, друзья!
Представляю вашему вниманию перевод этой замечательной статьи, в которой рассказывается о Miller — автономном, легковесном и мощном интерфейсе командной строки (Command Line Interface, CLI) для работы с данными в форматах CSV, JSON и некоторых других.
Интересно? Тогда прошу под кат.
Установка
- Linux:
apt-get install miller
- macOS:
brew install miller
- Windows:
choco install miller
Для того, чтобы убедиться в корректной установке Miller, открываем терминал и выполняем следующую команду:
mlr --version
Результат:
![](https://habrastorage.org/webt/le/vm/az/levmazu6dybibmyrxmg8keoruck.png)
Команда для получения помощи (списка доступных команд):
mlr help topics
Сигнатура команды
Сигнатура команды Miller выглядит следующим образом:
mlr [input/output file formats] [verbs] [file]
# например
mlr --csv filter '$color != "red"' example.csv
Здесь:
-
--csv
определяет, что форматом входного (обрабатываемого) файла является CSV; -
filter
определяет операцию, выполняемую с файлом (глагол — verb). В данном случае мы удаляем строки, которые не содержат поляcolor
со значениемred
. Существуют и другие глаголы, например,sort
иcut
(см. ниже); -
example.csv
определяет обрабатываемый файл.
Обзор операций
Данные
Скачиваем Рейтинг IMDb американских сериалов.
Глагол head позволяет получить первые 10 строк файла:
mlr ---csv head ./tv_ratings.csv
Результат:
![](https://habrastorage.org/webt/le/ip/aa/leipaajdzuszznkr5t_sggo20ci.png)
Для форматирования вывода используется флаг --opprint
:
mlr --csv --opprint head ./tv_ratings.csv
Результат:
![](https://habrastorage.org/webt/lr/ny/xf/lrnyxf5wpprwf5zuqrs3y-e4-p4.png)
Флаг --c2p
является сокращением для флагов --csv --opprint
.
Цепочка команд
Ключевое слово then
позволяет объединять глаголы в цепочку, т.е. выполнять несколько операций за один раз (см. ниже).
Удаление колонок
Колонка titleId
не несет никакой смысловой нагрузки. Удалим ее с помощью глагола cut:
mlr --c2p cut -x -f titleId then head ./tv_ratings.csv
Здесь:
-
-f
определяет удаляемые поля (перечисляются через запятую); -
-x
определяет, что удаляемые поля исключаются из вывода, а не включаются в него (поведение по умолчанию).
Результат:
![](https://habrastorage.org/webt/nn/v9/9d/nnv99dbpvj5wu2u5eslvfddpjio.png)
Фильтрация
Для фильтрации полей используется глагол filter. Получим первые 10 (по порядку в файле) серий первого сезона:
mlr --c2p filter '$seasonNumber == 1' then head ./tv_ratings.csv
Результат:
![](https://habrastorage.org/webt/0-/rz/tf/0-rztfztjscjrcth_pyekdv6trs.png)
Сортировка
Для сортировки полей используется глагол sort. Получим первые 10 серий с самыми высокими рейтингами:
mlr --c2p sort -nr av_rating then head ./tv_ratings.csv
Здесь:
-
-nr
определяет числовой нисходящий (от большего к меньшему) порядок сортировки (нули сортируются первыми).
Результат:
![](https://habrastorage.org/webt/rx/nv/n3/rxnvn32ekmd-hybrtgnh8o-t5ec.png)
Сохранение результата операций
Оператор >
позволяет выполнять запись результата операций в файл:
mlr --csv sort -nr av_rating ./tv_ratings.csv > ./sorted_tv_ratings.csv
Результат:
![](https://habrastorage.org/webt/cx/s2/hh/cxs2hhtejf2ojz14owcooindfb0.png)
Преобразование CSV в JSON
Для преобразования CSV в JSON используется флаг --c2j
:
mlr --c2j sort -nr av_rating ./tv_ratings.csv > ./sorted_tv_ratings.json
Результат:
![](https://habrastorage.org/webt/ui/cd/bo/uicdbokesqguhax2y3oxdqxnr70.png)
Задача
Рассмотрим пример практического использования Miller — получение списка 5 спортсменов, завоевавших наибольшее количество медалей на олимпиаде в Рио-де-Жанейро в 2016 году.
Скачиваем этот файл в формате CSV.
Взглянем на него:
mlr --c2p head ./athletes.csv
Результат:
![](https://habrastorage.org/webt/wx/9k/c1/wx9kc1njzyrn5pzmix-dszcf6jw.png)
Удаляем лишние поля:
mlr --csv -I cut -x -f id,info,weight,height,date_of_birth ./athletes.csv
Здесь:
-
-I
означает, что файл обрабатывается на месте, т.е. сначала создается временный файл, в который записывается результат операций, затем оригинальный файл перезаписывается временным.
Прим. пер.: я не буду перезаписывать оригинальный файл, а запишу результат операции в файл athletes_formatted.csv
с помощью следующей команды:
mlr -c cut -x -f id,info,weight,height,date_of_birth ./athletes.csv > ./athletes_formatted.csv
Здесь:
-
-c
— это сокращение для--csv
.
Результат:
![](https://habrastorage.org/webt/zd/mh/li/zdmhliqjzcmr2ylft9tvz0gfdtc.png)
У нас имеется статистика по количеству золотых, серебряных и бронзовых медалей. Общее количество медалей можно вычислить с помощью глагола put следующим образом:
mlr --c2p put '$medals=$bronze+$silver+$gold' then head ./athletes_formatted.csv
Результат:
![](https://habrastorage.org/webt/kk/ma/-r/kkma-rabz3en9_iyemifqjqcjie.png)
Сортируем список по количеству медалей от большего с меньшему:
mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head ./athletes_formatted.csv
Результат:
![](https://habrastorage.org/webt/vl/g2/yw/vlg2yw4f5jqmdpxv3h6sebrsrvk.png)
Ограничиваем вывод пятью спортсменами с помощью флага -n
:
mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head -n 5 ./athletes_formatted.csv
Результат:
![](https://habrastorage.org/webt/lz/es/zt/lzesztakos0n6setbxqmvbzz-gw.png)
Записываем результат в JSON-файл:
mlr --c2j put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head -n 5 ./athletes.csv > ./top5_athletes.json
Результат:
![](https://habrastorage.org/webt/e8/cu/wp/e8cuwp1vnjzxf_zsrjsy_j23kfs.png)
Здесь:
-
-j
— это сокращение для--json
Что если мы хотим получить пятерку лучших атлетов среди женщин? Проще простого:
mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then filter '$sex == "female"' \
then head -n 5 ./athletes_formatted.csv
Результат:
![](https://habrastorage.org/webt/jw/-u/zx/jw-uzxtfztlbkjne0kq4yk-ijao.png)
Надеюсь, что вы, как и я, узнали что-то новое и не зря потратили время.
Благодарю за внимание и happy coding!
Комментарии (7)
rukhi7
19.01.2023 08:15Шел 21-й век, железный человек разговаривал с роботом и силой мысли передвигал элементы схемы на голографической визуализации, а мы ...
-c — это сокращение для --csv.
Мы как в старые добрые времена сокращаем --csv до -c в командной строке.
Oceanshiver
20.01.2023 11:20Так это хорошо или плохо?
rukhi7
21.01.2023 10:56на вкус и цвет, конечно, товарищей нет, но лично для меня это достижением не выглядит.
gmtd
А еще можно загрузить csv в mysql, и оп-ля-ля...
aborouhin
Загрузить можно и в Pandas / Spark / Polars. Или в любимый мной OpenRefine, если надо с визуальным контролем результата почистить сильно "грязные" данные.
У miller, на первый взгляд, сильная сторона - возможность встроить его в какие-нибудь скрипты без лишних телодвижений, там, где более тяжёлые инструменты будут "из пушки по воробьям". Автору поста спасибо, запомнил, вдруг пригодится.
savostin
А еще можно подключить CSV к SQLite как virtual table.