Mior Agency

Un guide pour manipuler les données à partir de la ligne de commande

Permettez-moi de commencer cet article en disant que je ne suis pas une personne en phase terminale. Je n’utilise pas Vim. Réunion sed, grepOui awk alambiqué et contre-intuitif. Je préfère voir mes fichiers dans une interface utilisateur agréable. Malgré tout cela, j’ai pris l’habitude d’atteindre interfaces de ligne de commande (CLI) quand j’avais de petites tâches dédiées à accomplir. Parce que? Je vais vous expliquer tout cela ci-dessous. Dans cet article, vous apprendrez également à utiliser un outil CLI appelé Miller pour manipuler des données à partir de fichiers CSV, TSV et/ou JSON.

Pourquoi utiliser la ligne de commande ?

Tout ce que je montre ici peut être fait avec du code normal. Vous pouvez télécharger le fichier, analyser les données CSV, puis le transformer à l’aide de JavaScript, Python ou de tout autre langage. Mais il y a plusieurs raisons pour lesquelles je recherche des interfaces de ligne de commande (CLI) chaque fois que j’ai besoin de transformer des données :

  • Plus facile à lire.
    C’est plus rapide (pour moi) d’écrire un script en JavaScript ou Python pour mon traitement de données habituel. Mais revenir à un script peut être déroutant. Dans mon expérience, les manipulations de la ligne de commande sont plus difficiles à écrire au début mais plus faciles à lire plus tard.
  • Plus facile à jouer.
    Grâce aux gestionnaires de packages comme Homebrew, les CLI sont beaucoup plus faciles à installer qu’auparavant. Pas besoin de trouver la bonne version de Node.js ou Python, le gestionnaire de packages s’en charge pour vous.
  • vieillit bien.
    Comparées aux langages de programmation modernes, les CLI sont anciennes. Ils changent beaucoup plus lentement que les langages et les frameworks.

C’est quoi Miller ?

La principale raison pour laquelle j’aime Miller est que c’est un outil autonome. Il existe de nombreux outils formidables pour la manipulation de données, mais tous les autres outils que j’ai trouvés faisaient partie d’un écosystème spécifique. Les outils écrits en Python nécessitent de savoir s’en servir pip et environnements virtuels ; pour les écrits en Rust, c’était cargoetc.

En plus c’est rapide. Les fichiers de données sont transmis et non stockés en mémoire, ce qui signifie que vous pouvez effectuer des opérations sur des fichiers volumineux sans geler votre ordinateur.

En prime, Miller est activement entretenu, John Kerl reste vraiment au courant des relations publiques et des problèmes. En tant que développeur, j’éprouve toujours un sentiment de satisfaction lorsque je vois un projet open source soigné et bien entretenu avec une excellente documentation.

Facilité

  • linux : apt-get install miller ou Bière maison.
  • Mac OS : brew install miller en utilisant Homebrew.
  • Les fenêtres: choco install miller en utilisant Chocolatey.

C’est tout, et maintenant vous devriez avoir le mlr commande disponible dans votre terminal.

Courir mlr help topics pour voir si cela a fonctionné. Cela vous demandera de naviguer dans la documentation intégrée. Cependant, vous ne devriez pas en avoir besoin ; C’est à cela que sert ce tutoriel !

Plus après le saut! Continuez à lire ci-dessous ↓

Comment mlr Pièces

Les commandes de Miller fonctionnent comme suit :

mlr [input/output file formats] [verbs] [file]

Exemple: mlr --csv filter '$color != "red"' example.csv

Déconstruisons :

  • --csv spécifie le format du fichier d’entrée. C’est un fichier CSV.
  • filter est ce que nous faisons dans le fichier, appelé « verbe » dans la documentation. Dans ce cas, nous filtrons chaque ligne qui n’a pas le champ color ajusté à "red". Il existe de nombreux autres verbes comme sort Oui cut que nous explorerons plus tard.
  • example.csv est le fichier que nous manipulons.

Résumé des opérations

nous pouvons les utiliser verbes pour effectuer des opérations spécifiques sur vos données. Nous pouvons faire beaucoup. Nous allons explorer.

Données

Je vais utiliser un ensemble de données de Notes IMDb pour les séries télévisées américaines Créé par The Economist. Vous pouvez le télécharger ici ou le trouver dans le référentiel de cet article.

Noter: Par souci de concision, j’ai renommé le fichier de mlr --csv head ./IMDb_Economist_tv_ratings.csv une tv_ratings.csv.

Plus tôt, j’ai mentionné que chaque commande contient une opération ou un verbe spécifique. Apprenons notre premier, appelé head. Ce qu’il fait, c’est vous montrer le début du fichier (« l’en-tête ») au lieu d’imprimer le fichier entier sur la console.

Vous pouvez exécuter la commande suivante :

`mlr --csv head ./tv_ratings.csv`

Et voici la sortie que vous verrez :

titleId,seasonNumber,title,date,av_rating,share,genres
tt2879552,1,11.22.63,2016-03-10,8.489,0.51,"Drama,Mystery,Sci-Fi"
tt3148266,1,12 Monkeys,2015-02-27,8.3407,0.46,"Adventure,Drama,Mystery"
tt3148266,2,12 Monkeys,2016-05-30,8.8196,0.25,"Adventure,Drama,Mystery"
tt3148266,3,12 Monkeys,2017-05-19,9.0369,0.19,"Adventure,Drama,Mystery"
tt3148266,4,12 Monkeys,2018-06-26,9.1363,0.38,"Adventure,Drama,Mystery"
tt1837492,1,13 Reasons Why,2017-03-31,8.437,2.38,"Drama,Mystery"
tt1837492,2,13 Reasons Why,2018-05-18,7.5089,2.19,"Drama,Mystery"
tt0285331,1,24,2002-02-16,8.5641,6.67,"Action,Crime,Drama"
tt0285331,2,24,2003-02-09,8.7028,7.13,"Action,Crime,Drama"
tt0285331,3,24,2004-02-09,8.7173,5.88,"Action,Crime,Drama"

C’est un peu difficile à lire, alors facilitons les yeux en ajoutant --opprint.

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

La sortie résultante sera la suivante :

titleId   seasonNumber title            date          av_rating   share   genres
tt2879552      1       11.22.63         2016-03-10    8.489       0.51    Drama,Mystery,Sci-Fi
tt3148266      1       12 Monkeys       2015-02-27    8.3407      0.46    Adventure,Drama,Mystery
tt3148266      2       12 Monkeys       2016-05-30    8.8196      0.25    Adventure,Drama,Mystery
tt3148266      3       12 Monkeys       2017-05-19    9.0369      0.19    Adventure,Drama,Mystery
tt3148266      4       12 Monkeys       2018-06-26    9.1363      0.38    Adventure,Drama,Mystery
tt1837492      1       13 Reasons Why   2017-03-31    8.437       2.38    Drama,Mystery
tt1837492      2       13 Reasons Why   2018-05-18    7.5089      2.19    Drama,Mystery
tt0285331      1       24               2002-02-16    8.5641      6.67    Action,Crime,Drama
tt0285331      2       24               2003-02-09    8.7028      7.13    Action,Crime,Drama
tt0285331      3       24               2004-02-09    8.7173      5.88    Action,Crime,Drama

Bien mieux, non ?

Noter: au lieu d’écrire --csv --opprint à chaque fois, nous pouvons utiliser le --c2p option, qui est un raccourci.

enchaînement

C’est là que le plaisir commence. Au lieu d’exécuter plusieurs commandes, nous pouvons enchaîner les verbes en utilisant le then Mot-clé.

supprimer des colonnes

Vous pouvez voir qu’il y a un titleId colonne qui n’est pas très utile. Débarrassons-nous en utilisant le cut verbe.

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

Il vous donne la sortie suivante :

seasonNumber  title            date         av_rating   share    genres
     1      11.22.63          2016-03-10    8.489       0.51     Drama,Mystery,Sci-Fi
     1      12 Monkeys        2015-02-27    8.3407      0.46     Adventure,Drama,Mystery
     2      12 Monkeys        2016-05-30    8.8196      0.25     Adventure,Drama,Mystery
     3      12 Monkeys        2017-05-19    9.0369      0.19     Adventure,Drama,Mystery
     4      12 Monkeys        2018-06-26    9.1363      0.38     Adventure,Drama,Mystery
     1      13 Reasons Why    2017-03-31    8.437       2.38     Drama,Mystery
     2      13 Reasons Why    2018-05-18    7.5089      2.19     Drama,Mystery
     1      24                2002-02-16    8.5641      6.67     Action,Crime,Drama
     2      24                2003-02-09    8.7028      7.13     Action,Crime,Drama
     3      24                2004-02-09    8.7173      5.88     Action,Crime,Drama

fait amusant

C’est ainsi que j’ai découvert Miller pour la première fois ! Je jouais avec un jeu de données CSV pour https://details.town/ qui avait une colonne inutile et cherchais « comment supprimer une colonne de la ligne de commande CSV ». J’ai découvert Miller, j’ai adoré, puis j’ai soumis un article à Smashing Magazine. Maintenant nous y sommes !

Filtre

C’est le verbe que j’ai montré plus tôt. Nous pouvons supprimer toutes les lignes qui ne correspondent pas à une expression spécifique, ce qui nous permet de nettoyer nos données à quelques caractères seulement.

Si nous ne voulons que le classement des premières saisons de chaque série dans l’ensemble de données, voici comment procéder :

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

Classification

Nous pouvons trier nos données en fonction d’une colonne spécifique, comme dans une interface utilisateur comme Excel ou macOS Numbers. Voici comment trier vos données en fonction de la série la mieux notée :

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

La sortie résultante sera la suivante :

titleId   seasonNumber title                         date         av_rating  share   genres
tt0098887      1       Parenthood                    1990-11-13   9.6824     1.68    Comedy,Drama
tt0106028      6       Homicide: Life on the Street  1997-12-05   9.6        0.13    Crime,Drama,Mystery
tt0108968      5       Touched by an Angel           1998-11-15   9.6        0.08    Drama,Family,Fantasy
tt0903747      5       Breaking Bad                  2013-02-20   9.554      18.95   Crime,Drama,Thriller
tt0944947      6       Game of Thrones               2016-05-25   9.4943     15.18   Action,Adventure,Drama
tt3398228      5       BoJack Horseman               2018-09-14   9.4738     0.45    Animation,Comedy,Drama
tt0103352      3       Are You Afraid of the Dark?   1994-02-23   9.4349     2.6     Drama,Family,Fantasy
tt0944947      4       Game of Thrones               2014-05-09   9.4282     11.07   Action,Adventure,Drama
tt0976014      4       Greek                         2011-03-07   9.4        0.01    Comedy,Drama
tt0090466      4       L.A. Law                      1990-04-05   9.4        0.1     Drama

on peut voir ça Paternitéà partir de 1990, il a la cote la plus élevée sur IMDb, qui savait !

Sauver nos opérations

Par défaut, Miller n’imprime que ses données traitées sur la console. Si nous voulons l’enregistrer dans un autre fichier CSV, nous pouvons utiliser le > opérateur.

Si nous voulions enregistrer nos données triées dans un nouveau fichier CSV, voici à quoi ressemblerait la commande :

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

Convertir CSV en JSON

La plupart du temps, vous n’utilisez pas les données CSV directement dans votre application. Le convertit dans un format plus facile à lire ou ne nécessitant pas de dépendances supplémentaires, telles que JSON.

Miller vous donne le --c2j option pour convertir vos données de CSV en JSON. Voici comment procéder pour nos données triées :

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

Étude de cas : Top 5 des athlètes les plus médaillés à Rio 2016

Appliquons tout ce que nous avons appris ci-dessus à un cas d’utilisation réel. Supposons que vous disposiez d’un ensemble de données détaillées sur tous les athlètes qui ont participé aux Jeux Olympiques de Rio 2016 et que vous souhaitiez savoir qui sont les 5 avec le plus de médailles.

Tout d’abord, téléchargez les données de l’athlète au format CSV, puis enregistrez-les dans un fichier nommé athletes.csv.

Ouvrons le fichier suivant :

mlr --c2p head ./athletes.csv

La sortie résultante ressemblera à ce qui suit :

id        name                nationality sex    date_of_birth height weight sport      gold silver bronze info
736041664 A Jesus Garcia      ESP         male   1969-10-17    1.72    64     athletics    0    0      0      -
532037425 A Lam Shin          KOR         female 1986-09-23    1.68    56     fencing      0    0      0      -
435962603 Aaron Brown         CAN         male   1992-05-27    1.98    79     athletics    0    0      1      -
521041435 Aaron Cook          MDA         male   1991-01-02    1.83    80     taekwondo    0    0      0      -
33922579  Aaron Gate          NZL         male   1990-11-26    1.81    71     cycling      0    0      0      -
173071782 Aaron Royle         AUS         male   1990-01-26    1.80    67     triathlon    0    0      0      -
266237702 Aaron Russell       USA         male   1993-06-04    2.05    98     volleyball   0    0      1      -
382571888 Aaron Younger       AUS         male   1991-09-25    1.93    100    aquatics     0    0      0      -
87689776  Aauri Lorena Bokesa ESP         female 1988-12-14    1.80    62     athletics    0    0      0      -

Facultatif : Nettoyer le fichier

Le fichier CSV contient des champs dont nous n’avons pas besoin. Nettoyons-le en enlevant le info , id , weightOui date_of_birth Colonnes

mlr --csv -I cut -x -f id,info,weight,date_of_birth athletes.csv

Nous pouvons maintenant passer à notre problème initial : nous voulons trouver qui a remporté le plus de médailles. nous avons combien de chaque médaille (bronze, argent et or) ont été remportés par les athlètes, mais pas par le nombre total de médailles par athlète.

Calculons une nouvelle valeur appelée medals qui correspond à ce nombre total (bronze, argent et or additionnés).

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

Il vous donne la sortie suivante :

name                 nationality   sex      height  sport        gold silver bronze medals
A Jesus Garcia       ESP           male     1.72    athletics      0    0      0      0
A Lam Shin           KOR           female   1.68    fencing        0    0      0      0
Aaron Brown          CAN           male     1.98    athletics      0    0      1      1
Aaron Cook           MDA           male     1.83    taekwondo      0    0      0      0
Aaron Gate           NZL           male     1.81    cycling        0    0      0      0
Aaron Royle          AUS           male     1.80    triathlon      0    0      0      0
Aaron Russell        USA           male     2.05    volleyball     0    0      1      1
Aaron Younger        AUS           male     1.93    aquatics       0    0      0      0
Aauri Lorena Bokesa  ESP           female   1.80    athletics      0    0      0      0
Ababel Yeshaneh      ETH           female   1.65    athletics      0    0      0      0

Trier par le plus grand nombre de médailles en ajoutant un sort.

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

Respectivement, la sortie résultante sera la suivante :

name              nationality  sex     height  sport       gold silver bronze medals
Michael Phelps    USA          male    1.94    aquatics      5    1      0      6
Katie Ledecky     USA          female  1.83    aquatics      4    1      0      5
Simone Biles      USA          female  1.45    gymnastics    4    0      1      5
Emma McKeon       AUS          female  1.80    aquatics      1    2      1      4
Katinka Hosszu    HUN          female  1.75    aquatics      3    1      0      4
Madeline Dirado   USA          female  1.76    aquatics      2    1      1      4
Nathan Adrian     USA          male    1.99    aquatics      2    0      2      4
Penny Oleksiak    CAN          female  1.86    aquatics      1    1      2      4
Simone Manuel     USA          female  1.78    aquatics      2    2      0      4
Alexandra Raisman USA          female  1.58    gymnastics    1    2      0      3

Restreindre au top 5 en ajoutant -n 5 pour vous head opération.

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

Vous vous retrouverez avec le fichier suivant :

name             nationality  sex      height  sport        gold silver bronze medals
Michael Phelps   USA          male     1.94    aquatics       5     1      0      6
Katie Ledecky    USA          female   1.83    aquatics       4     1      0      5
Simone Biles     USA          female   1.45    gymnastics     4     0      1      5
Emma McKeon      AUS          female   1.80    aquatics       1     2      1      4
Katinka Hosszu   HUN          female   1.75    aquatics       3     1      0      4

Dans une dernière étape, nous allons le convertir en un fichier JSON avec le --c2j option.

Voici notre commande finale :

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

Avec une seule commande, nous calculons de nouvelles données, trions le résultat, le tronquons et le convertissons en JSON.

[
  {
    "name": "Michael Phelps",
    "nationality": "USA",
    "sex": "male",
    "height": 1.94,
    "weight": 90,
    "sport": "aquatics",
    "gold": 5,
    "silver": 1,
    "bronze": 0,
    "medals": 6
  }
  // Other entries omitted for brevity.
]

Cousine: Si vous souhaitez afficher les 5 meilleures femmes, vous pouvez ajouter un filter.

mlr --c2p put '$medals=$bronze+$silver+$gold' then sort -nr medals then filter '$sex == "female"' then head -n 5 ./athletes.csv

Respectivement, vous vous retrouveriez avec la sortie suivante :

name              nationality   sex       height   sport        gold silver bronze medals
Katie Ledecky     USA           female    1.83     aquatics       4    1      0      5
Simone Biles      USA           female    1.45     gymnastics     4    0      1      5
Emma McKeon       AUS           female    1.80     aquatics       1    2      1      4
Katinka Hosszu    HUN           female    1.75     aquatics       3    1      0      4
Madeline Dirado   USA           female    1.76     aquatics       2    1      1      4

conclusion

J’espère que cet article vous a montré à quel point Miller est polyvalent et vous a donné une idée de la puissance des outils en ligne de commande. N’hésitez pas à rechercher sur Internet la meilleure CLI la prochaine fois que vous vous retrouverez à écrire un autre script aléatoire.

Ressources

Lectures complémentaires dans Smashing Magazine

édito fracassant
(Oui oui)

Laissez un commentaire

Derniers Posts
Une Question ? Un Projet ?
Quel que soit votre projet, MIOR AGENCY vous écoute, analyse vos besoins et propose des pistes de travail en conséquence. Vous avancez avec sérénité et confiance.