Linux Fu: Miller The Killer rend CSV No Pest

Historiquement, l’un des avantages d’Unix et de Linux est que tout est un fichier et que les fichiers ne sont que des séquences de caractères. Bien sûr, la pratique moderne est que tout n’est pas un fichier, et il y a une prolifération de fichiers avec une structure imposée. Cependant, si vous avez déjà travaillé sur d’anciens systèmes où votre accès aux fichiers était par bloc, vous apprécierez les fichiers de type Unix. Des outils classiques comme awk, sedet grep travailler avec cette idée. Les fichiers ne sont que des caractères. Mais cela a parfois ses problèmes. C’est la motivation derrière un outil appelé Miller, et je pense qu’il mérite plus d’attention car, pour certaines tâches, c’est une bouée de sauvetage.

Le problème

Envisagez d’essayer de traiter un fichier délimité par des virgules, appelé fichier CSV. Il existe de nombreuses variantes à ce type de fichier. En voici une qui définit deux « colonnes ». J’ai délibérément utilisé différents formats de ligne comme test, mais le plus souvent, vous obtenez un format pour l’ensemble du fichier :

Slot,String 
A,"Hello" 
"B",Howdy 
"C","Hello Hackaday" 
"D","""Madam, I'm Adam,"" he said." 
E 100,With some spaces!
X,"With a comma, or two, even"


La première colonne, Slot, contient les éléments A, B, C, D et E 100. Notez que certains éléments sont cités, mais d’autres non. Dans tous les cas, le contenu de la colonne est B et non « B » car les guillemets ne font pas partie des données.

La deuxième colonne, String, contient un mélange de guillemets, pas de guillemets, d’espaces et même de virgules entre guillemets. Supposons que vous vouliez traiter cela avec awk. Vous pouvez le faire, mais c’est douloureux. Notez que les guillemets sont échappés à l’aide de guillemets doubles, comme c’est la coutume dans les fichiers CSV. Écrire une expression régulière pour briser cela n’est pas impossible mais douloureux. C’est là qu’intervient Miller. Il connaît les formats de données tels que CSV, JSON, KDVP8 et quelques autres. Il peut également sortir dans ces formats et d’autres comme Markdown, par exemple.

Exécutions d’exemples simples

Parce qu’il connaît le format, il peut traiter le fichier facilement :

$ mlr –icsv chat miller.in
Emplacement=A,Chaîne=Bonjour
Emplacement=B,chaîne=Bonjour
Slot=C,String=Bonjour Hackaday
Slot=D,String=”Madame, je suis Adam,” dit-il.
Slot=E 100,String=Avec quelques espaces !
Slot=X,String=Avec une virgule, ou deux, même

Notez qu’il n’y a pas de commande appelée « miller ». Le nom de la commande est « mlr ». Cette sortie ne serait pas un mauvais format pour un traitement ultérieur avec awk, mais nous n’avons pas à le faire. Miller peut probablement faire tout ce dont nous avons besoin. Avant de regarder cela, cependant, considérez ce qui se passerait si vous vouliez juste une sortie au joli format :

Pas mal! N’oubliez pas que l’outil ferait la même chose avec JSON et d’autres formats également.

Tant d’options

Le nombre d’options peut être intimidant. Il existe des options pour transmettre ou ignorer les commentaires, traiter les données compressées ou personnaliser un peu le format du fichier d’entrée ou de sortie.

Mais le vrai pouvoir de Miller, ce sont les verbes. Dans l’exemple ci-dessus, le verbe était cat. Ceux-ci sont principalement nommés d’après les commandes Linux qu’ils dupliquent. Par exemple, cut supprimera certains champs des données. Le grep, headet tail les commandes font toutes ce que vous attendez.

Il y a aussi beaucoup de nouveaux verbes. Count vous donnera un décompte de la quantité de données écoulées et filter est une meilleure version de grep. Vous pouvez effectuer des jointures, des tris et même des statistiques de type base de données et générer des graphiques à barres textuels.

Le filter et put les commandes ont à leur disposition un langage de programmation complet qui contient tout ce que vous vous attendez à trouver dans un langage comme awk ou alors Perl.

Ce qui est bien, c’est que lorsque vous souhaitez supprimer un champ ou un tri, vous pouvez vous y référer par son nom (comme « Slot »), et Miller saura ce que vous voulez dire. Il existe un moyen de faire référence aux champs avec des nombres si vous le devez, mais c’est une chose rare dans un script Miller.

Par exemple, si vous avez des données avec des champs « stock » et « réserve » dont vous souhaitez vous débarrasser, vous pouvez écrire quelque chose comme ceci :

mlr --icsv --opprint cut -f stock,reserve inventory.csv

Ou, peut-être voulez-vous sélectionner des lignes où le stock est « N »:

mlr --icsv --opprint filter '$stock == "N"' inventory.csv

Allez lire

Il n’y a tout simplement pas assez de place pour couvrir toutes les fonctionnalités de ce programme puissant. Je vous suggère de consulter Miller en 10 minutes qui fait partie de la documentation officielle. Vous aurez toujours besoin de lire la documentation plus en détail, mais au moins vous aurez un bon départ.

Ne vous méprenez pas, nous aimons toujours awk. Avec un peu de travail, vous pouvez lui faire faire presque n’importe quoi. Mais si vous pouvez travailler moins avec Miller, pourquoi pas ?

François Zipponi
Je suis François Zipponi, éditorialiste pour le site 10-raisons.fr. J'ai commencé ma carrière de journaliste en 2004, et j'ai travaillé pour plusieurs médias français, dont le Monde et Libération. En 2016, j'ai rejoint 10-raisons.fr, un site innovant proposant des articles sous la forme « 10 raisons de... ». En tant qu'éditorialiste, je me suis engagé à fournir un contenu original et pertinent, abordant des sujets variés tels que la politique, l'économie, les sciences, l'histoire, etc. Je m'efforce de toujours traiter les sujets de façon objective et impartiale. Mes articles sont régulièrement partagés sur les réseaux sociaux et j'interviens dans des conférences et des tables rondes autour des thèmes abordés sur 10-raisons.fr.