[Перевод] Краткое руководство по работе с данными с помощью Miller

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

Результат:


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

Результат:


leipaajdzuszznkr5t_sggo20ci.png

Для форматирования вывода используется флаг --opprint:

mlr --csv --opprint head ./tv_ratings.csv

Результат:


lrnyxf5wpprwf5zuqrs3y-e4-p4.png

Флаг --c2p является сокращением для флагов --csv --opprint.


Цепочка команд

Ключевое слово then позволяет объединять глаголы в цепочку, т.е. выполнять несколько операций за один раз (см. ниже).


Удаление колонок

Колонка titleId не несет никакой смысловой нагрузки. Удалим ее с помощью глагола cut:

mlr --c2p cut -x -f titleId then head ./tv_ratings.csv

Здесь:


  • -f определяет удаляемые поля (перечисляются через запятую);
  • -x определяет, что удаляемые поля исключаются из вывода, а не включаются в него (поведение по умолчанию).

Результат:


nnv99dbpvj5wu2u5eslvfddpjio.png

Фильтрация

Для фильтрации полей используется глагол filter. Получим первые 10 (по порядку в файле) серий первого сезона:

mlr --c2p filter '$seasonNumber == 1' then head ./tv_ratings.csv

Результат:


0-rztfztjscjrcth_pyekdv6trs.png

Сортировка

Для сортировки полей используется глагол sort. Получим первые 10 серий с самыми высокими рейтингами:

mlr --c2p sort -nr av_rating then head ./tv_ratings.csv

Здесь:


  • -nr определяет числовой нисходящий (от большего к меньшему) порядок сортировки (нули сортируются первыми).

Результат:


rxnvn32ekmd-hybrtgnh8o-t5ec.png

Сохранение результата операций

Оператор > позволяет выполнять запись результата операций в файл:

mlr --csv sort -nr av_rating ./tv_ratings.csv > ./sorted_tv_ratings.csv

Результат:


cxs2hhtejf2ojz14owcooindfb0.png

Преобразование CSV в JSON

Для преобразования CSV в JSON используется флаг --c2j:

mlr --c2j sort -nr av_rating ./tv_ratings.csv > ./sorted_tv_ratings.json

Результат:


uicdbokesqguhax2y3oxdqxnr70.png

Задача

Рассмотрим пример практического использования Miller — получение списка 5 спортсменов, завоевавших наибольшее количество медалей на олимпиаде в Рио-де-Жанейро в 2016 году.

Скачиваем этот файл в формате CSV.

Взглянем на него:

mlr --c2p head ./athletes.csv

Результат:


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.

Результат:


zdmhliqjzcmr2ylft9tvz0gfdtc.png

У нас имеется статистика по количеству золотых, серебряных и бронзовых медалей. Общее количество медалей можно вычислить с помощью глагола put следующим образом:

mlr --c2p put '$medals=$bronze+$silver+$gold' then head ./athletes_formatted.csv

Результат:


kkma-rabz3en9_iyemifqjqcjie.png

Сортируем список по количеству медалей от большего с меньшему:

mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head ./athletes_formatted.csv

Результат:


vlg2yw4f5jqmdpxv3h6sebrsrvk.png

Ограничиваем вывод пятью спортсменами с помощью флага -n:

mlr --c2p put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head -n 5 ./athletes_formatted.csv

Результат:


lzesztakos0n6setbxqmvbzz-gw.png

Записываем результат в JSON-файл:

mlr --c2j put '$medals=$bronze+$silver+$gold' \
then sort -nr medals \
then head -n 5 ./athletes.csv > ./top5_athletes.json

Результат:


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

Результат:


jw-uzxtfztlbkjne0kq4yk-ijao.png

Надеюсь, что вы, как и я, узнали что-то новое и не зря потратили время.

Благодарю за внимание и happy coding!


p-u9l27ynelxi92bcmdxhu76ma8.png

© Habrahabr.ru