Fermer

décembre 28, 2022

Un guide pour la manipulation de données en ligne de commande

Un guide pour la manipulation de données en ligne de commande


Fini les scripts aléatoires en Python et JavaScript pour transformer les données CSV ou JSON. Dans cet article, Alvin Bryan vous montre comment utiliser Millerun petit et puissant outil CLI, pour faire tout votre traitement de données.

Permettez-moi de préfacer cet article en disant que je ne suis pas une personne terminale. Je n’utilise pas Vim. je trouve sed, grepet awk alambiqué et contre-intuitif. Je préfère voir mes fichiers dans une belle interface utilisateur. 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. Pourquoi? Je vais vous expliquer tout cela ci-dessous. Dans cet article, vous apprendrez également à utiliser un outil CLI nommé Miller pour manipuler les données des 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 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 fais appel à des interfaces de ligne de commande (CLI) chaque fois que j’ai besoin de transformer des données :

  • Plus facile à lire.
    Il est plus rapide (pour moi) d’écrire un script en JavaScript ou Python pour mon traitement de données habituel. Mais, un script peut être déroutant pour y revenir. Dans mon expérience, les manipulations de la ligne de commande sont plus difficiles à écrire au départ mais plus faciles à lire par la suite.
  • Plus facile à reproduire.
    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.
  • Bien vieillir.
    Comparées aux langages de programmation modernes, les CLI sont anciennes. Ils changent beaucoup plus lentement que les langages et les frameworks.

Qu’est-ce que Miller ?

La principale raison pour laquelle j’aime Miller est que c’est un outil autonome. Il existe de nombreux excellents outils de 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écessitaient de savoir utiliser pip et environnements virtuels ; pour ceux écrits en Rust, c’était cargoetc.

En plus c’est rapide. Les fichiers de données sont diffusés en continu et non conservé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, Jean gars se tient vraiment au courant des relations publiques et des problèmes. En tant que développeur, j’ai toujours un sentiment de satisfaction lorsque je vois un projet open source soigné et maintenu avec une excellente documentation.

Installation

  • Linux : apt-get install miller ou alors Brassage maison.
  • Mac OS : brew install miller en utilisant Homebrew.
  • Les fenêtres: choco install miller en utilisant Chocolaté.

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

Cours mlr help topics pour voir si cela a fonctionné. Cela vous donnera des instructions pour naviguer dans la documentation intégrée. Vous ne devriez pas en avoir besoin, cependant; c’est à ça que sert ce tuto !

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

Comment mlr Travaux

Les commandes Miller fonctionnent de la manière suivante :

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 sur le fichier, appelé un « verbe » dans la documentation. Dans ce cas, nous filtrons chaque ligne qui n’a pas le champ color mis à "red". Il existe de nombreux autres verbes comme sort et cut que nous explorerons plus tard.
  • example.csv est le fichier que nous manipulons.

Aperçu des opérations

Nous pouvons utiliser ceux verbes pour exécuter des opérations spécifiques sur vos données. Nous pouvons faire beaucoup. Explorons.

Données

Je vais utiliser un ensemble de données de Classements 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 dépôt pour cet article.

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

Ci-dessus, 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 (la « tête ») plutôt que d’imprimer le fichier entier dans 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 choses 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, n’est-ce pas ?

Noter: Plutôt que de taper --csv --opprint chaque fois, nous pouvons utiliser le --c2p option, qui est un raccourci.

Chaînage

C’est là que le plaisir commence. Plutôt que 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 entendu parler de Miller pour la première fois ! Je jouais avec un ensemble de données CSV pour https://details.ville/ qui avait une colonne inutile, et j’ai cherché « comment supprimer une colonne de la ligne de commande CSV ». J’ai découvert Miller, j’ai adoré, puis j’ai écrit un article au magazine Smashing. Maintenant nous y sommes !

Filtre

C’est le verbe que j’ai d’abord 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 avec seulement quelques caractères.

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

Tri

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 Parentéà partir de 1990, a la cote la plus élevée sur IMDb – qui savait !

Sauver nos opérations

Par défaut, Miller n’imprime que vos 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. Vous le convertissez dans un format plus facile à lire ou qui ne nécessite pas de dépendances supplémentaires, comme 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 : Les 5 meilleurs athlètes avec le plus grand nombre de médailles à 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 chaque athlète ayant participé aux Jeux olympiques de Rio en 2016 et que vous souhaitiez savoir qui sont les 5 avec le plus grand nombre de médailles.

Première, télécharger les données de l’athlète au format CSVpuis enregistrez-le 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 quelques champs dont nous n’avons pas besoin. Nettoyons-le en enlevant le info , id , weightet 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 grand nombre de médailles. Nous avons combien de chaque médaille (bronze, argent et or) remportés par les athlètes, mais pas 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 à ton 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

Comme dernière étape, convertissons ceci 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 avons calculé de nouvelles données, trié le résultat, l’avons tronqué et l’avons converti 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.
]

Prime: Si vous vouliez montrer les 5 meilleures femmes, vous pourriez 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 et vous a donné un avant-goût de la puissance des outils de ligne de commande. N’hésitez pas à fouetter Internet pour obtenir la meilleure CLI la prochaine fois que vous vous retrouverez à écrire un autre script aléatoire.

Ressources

Lectures complémentaires sur Smashing Magazine

Éditorial fracassant
(yk, il)




Source link

décembre 28, 2022