Icaunux - Le Forum

Forum de l'Association ICAUNUX

Vous n'êtes pas identifié(e).

Annonce

Les Inscriptions au forum sont temporairement désactivées en attendant de trouver une solution efficace contre les inscriptions fictives très nombreuses ces derniers temps. Si vous souhaitez vous inscrire sur le forum, merci d'envoyer une demande par mail à l'adresse contact@icaunux.org. Désolé de cette gène occasionnée.

#1 02-02-2016 00:59:43

IceCat
Membre
Lieu : 93
Inscription : 17-11-2012
Messages : 682

Tri de données textes en ligne de commande

Bonsoir,

Afin de faire une newsletter, notre président m'a demandé si je pouvais récolter les adresses mail des adhérents des deux dernières années. Et nous avons eu la bonne idée de stocker les informations sur nos adhérents dans des feuilles de tableur créées avec libreoffice (tableur = excel). Du coup, comment faire ça sans se palucher les fichiers à la main, et ensuite faire le tri des doublons (car oui, la plupart des adhérents de 2015 ont ré-adhéré en 2016, donc certaines des adresses sont présentes dans les deux fichiers) ?

Hé bien c'est là que la ligne de commande et ses outils magiques entre en jeu pour nous simplifier la vie !

  1. Pemière étape, transformer les .ods en .csv

    69O0UmLQ3Lwr.png

    Les fichiers .ods créés par le tableur ne sont pas lisibles directement dans le terminal. Ce ne sont pas que de simples fichier texte. Il faut donc les transformer en quelque-chose de lisible par le terminal, et pour ça on peut enregistrer en CSV, un format de fichier texte.

    J'enregistre donc nos deux feuilles contenant la liste des adhérents, leurs adresses, numéro de tel, mail, etc. en deux fichiers .csv, que j'appelle adh2015.csv et adh2016.csv.

    Lorsqu'on affiche un .csv avec le terminal, ça donne quelque chose comme :

    DATES;N Adh;CIVILITE;Prénom;NOM;Adresse 1;Code Postal;Ville;Telephone;Portable;Courriel;
    27/09/2014;1;Mme;P*****;M*****;5 Rue de la ****;89100;****ERS;03.86.**.**.**;06.78.**.**.**;****.m***@orange.fr;
    27/09/2014;2;M;Ja****;J****;;89100;******ERS;;06.**.63.**.**;ja****.j***@free.fr;
    15/11/2014;3;M;Ph**** ;****;8 Rue ** *******;89000;AUXERRE;03.**.**.**.**;06.**.**.**.**;ac*****@free.fr;
    15/11/2014;4;M;Julien;A*****;9 Rue du P****;89***;****NES;;06.61.17.**.**;julien.******@lon**.fr;
    15/11/2014;5;M.;Christophe;P******;"5, Allée *******";89***;****EAU;03.86.**.**.**;06 67 ** ** **;c*****@gmail.com;

    (les *** sont là pour garder l'anonymat de nos membres wink)
    On voit qu'à la place des cellules, les données sont affichées lignes par lignes mais séparées par des points-virgule.

  2. Seconde étape, le tri pour ne sortir que ce qui nous intéresse


    J'ai utilisé l'utilitaire "awk" (qui est carrément un langage de programmation) afin de faire le tri dans le texte, et de renvoyer le résultat dans un fichier que j'appelerai "mailadh.txt" :

    awk -F";" '$11 !~ /Courriel/ { print $11 }' adh2015.csv > mailadh.txt

    Ce qui veut dire :

    • awk => nom du programme

    • -F, => -F désigne le délimiteur, ici c'est le point-virgule (;)

    • $11 !~ /texte/ => sauf ce qui contient le texte entre les // après le 10ème séparateur (11ème variable)

    • {print $11} => imprime la 11ème variable

    • adh2015.csv => fait tout ce qui est décrit avant, sur le fichier adh2015.csv

    • > mailadh.txt => imprime le résultat dans le fichier mailadh.txt

    J'ai maintenant un fichier mailadh.txt qui contient la liste des adresses mails contenu dans le fichier csv.
    Par contre, il contient des lignes vides (la première qui contenait le titre du tableau, la seconde qui contenait les titres des colonnes et une dernière où un adhérent n'avait pas d'adresse mail).
    On peut retirer ces lignes vides avec l'utilitaire sed :

    sed -i '/^$/d' mailadh.txt

    Afin de faire une vérification rapide qu'il n'y a pas de loupés (par exemple, si un ; était mis dans une adresse il serait interprété comme un délimiteur, ce qui décalerait la sélection dans la ligne où ce point-vigule en trop est présent, par conséquent il manquerait une adresse mail), on peut compter le nombbre d'adresses récupérées dans le fichier :

    cat mailadh.txt | wc -l
    23

    Je sais que le tableur contient 27 lignes, dont 1 pour le titre, une vide, une pour le titre des colonnes et un adhérent n'a pas donné son adresse mail. 27 - 4 =  23, bingo, le compte est bon !

  3. Deux traitements en une ligne !


    On fait la même chose, mais avec le fichier 2016, où une colonne a été ajoutée. Donc la variable recherchée n'est plus à la 11ème place, mais à la 12ème. Et puis cette fois, on ajoute la suppression des lignes vide directement à la suite du premier traitement, et on ajoute tout ça à notre fichier déjà rempli avec les adresses de 2015 :

    awk -F";" '$12 !~ /Courriel/ { print $12 }' adh2016.csv | sed '/^$/d' >> mailadh.txt
  4. Suppression des doublons


    On a un beau fichier, qui contient maintenant :

    cat mailadh.txt |wc -l
    49

    49 adresses mail !

    Cependant, il y a des adhérents qui se renouvellent d'une année sur l'autre, donc des adresses en double dans le fichier.
    Une manière simple de supprimer les lignes dupliquées est d'utiliser l'utilitaire sort avec l'option -u :

    sort -u mailadh.txt -o mailadh.txt

    (-u pour unique, et -o mailadh.txt pour qu'il écrive le résultat obtenu dans le fichier)

    cat mailadh.txt |wc -l
    27

    Tadaaam ! Nous avons là un fichier mailadh.txt avec une liste de 27 adresses mails uniques !

    Ces manipulations peuvent vous sembler compliquer, elles demandent en effet un peu d'apprentissage et de pratique.
    Mais sachez que lorsque vous les maitrisez, vous gagner un temps incroyable !

    J'ai mis 10x plus de temps à rédiger ce texte qu'à faire le tri dans les adresses...


promotion.php?image=PL-user.png&membre=IceCat

Hors ligne

#2 02-02-2016 10:18:35

yoda89
Président
Lieu : Villefargeau
Inscription : 13-12-2007
Messages : 1 202

Re : Tri de données textes en ligne de commande

Bravo, voilà un bel exemple de la puissance de la ligne de commande dans un cas pratique concret.
Je rassure les adhérents, on ira pas aussi loin lors de la séance d'initiation lors d'une prochaine rencontre mais ca vous montre les possibilités de la ligne de commande sachant que si les opérations sont répétitives il est possible de les enchaîner dans un programme (script) pour les automatiser. Il est difficile de connaitre les nombreuses commandes avec toutes leurs options, on trouve toutes la documentation sur Internet.

Hors ligne

#3 04-02-2016 14:05:17

wanica
Membre
Inscription : 13-11-2008
Messages : 2 070

Re : Tri de données textes en ligne de commande

beau boulot !

Hors ligne

Pied de page des forums