IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Contrôle d'existence via une table dans un shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut Contrôle d'existence via une table dans un shell
    Bonjour,
    Comment contrôler l'existence d'un enregistrement par l'intermédiaire d'une table, le plus "proprement" possible ?
    C'est une question générale sur la bonne façon de procéder.

    Prenons un cas pour exemple :
    Nous avons :
    1/ un fichier (maître) dont chaque ligne est identifiée par un champ identifiant placé en première position (champ numéro 1)
    2/ une table contenant tous les identifiants autorisés; cette table est en pratique un fichier dont la première colonne est la liste des identifiants valides

    Que voulons nous faire ?
    => Contrôler la validité de chaque ligne du fichier maître à l'aide de la table; et ne garder que les lignes du fichier maître dont l'identifiant est présent dans la table.

    Je pensais à la commande shell join pour faire cela.
    Voici un petit jeu de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/bin/bash                   
    #
    echo "cat fichier.csv"
    cat fichier.csv
    echo
     
    echo "cat table.csv"
    cat table.csv
    echo
     
    echo "-----------------------------------------------------------------"
    echo 'join -11 -21 -t";" -a1 -o 1.1 1.2 fichier.csv table.csv > zf3.csv'
          join -11 -21 -t";" -a1 -o 1.1 1.2 fichier.csv table.csv > zf3.csv
    echo
     
    echo "cat zf3.csv"
    cat zf3.csv
    echo
     
    echo "-----------------------------------------------------------------"
    echo 'join -11 -21 -t";" -a2 -o 1.1 1.2 fichier.csv table.csv > zf3.csv'
          join -11 -21 -t";" -a2 -o 1.1 1.2 fichier.csv table.csv > zf3.csv
    echo
     
    echo "cat zf3.csv"
    cat zf3.csv
    Ce qui donne à l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    $ ./ztst_p1.sh 
    cat fichier.csv
    a1;present_fichier_ok
    a3;present_fichier_ok
    a4;present_fichier_KOKO
    a5;present_fichier_ok
    a7;present_fichier_ok
     
    cat table.csv
    a1;present_table_ok
    a2;passé___table_KOKO
    a3;present_table_ok
    a5;present_table_ok
    a6;futur___table_KOKO
    a7;present_table_ok
    a8;futur___table_KOKO
     
    -----------------------------------------------------------------
    join -11 -21 -t";" -a1 -o 1.1 1.2 fichier.csv table.csv > zf3.csv
     
    cat zf3.csv
    a1;present_fichier_ok
    a3;present_fichier_ok
    a4;present_fichier_KOKO
    a5;present_fichier_ok
    a7;present_fichier_ok
     
    -----------------------------------------------------------------
    join -11 -21 -t";" -a2 -o 1.1 1.2 fichier.csv table.csv > zf3.csv
     
    cat zf3.csv
    a1;present_fichier_ok
    ;
    a3;present_fichier_ok
    a5;present_fichier_ok
    ;
    a7;present_fichier_ok
    ;
    La commande shell join avec l'option -a2 marcherait bien s'il n'y avait pas 4 lignes vides (

    Comment feriez-vous ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    Bonjour,
    une table contenant tous les identifiants autorisés
    alors pourquoi la table contient-elle d'autres "identifiants" ?

  3. #3
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Entre autre,
    la table peut contenir des identifiants anciens obsolètes à l'instant présent, mais qu'il faut garder pour "rejouer" des situations passées.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ join -j1 -o 1.1 1.2 -t ';' /tmp/fichier.csv /tmp/table.csv
    a1;present_fichier_ok
    a3;present_fichier_ok
    a5;present_fichier_ok
    a7;present_fichier_ok
    j'ai râté un truc ?

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Juste une question: As-tu la garanti que tes fichiers sont préalablement triés (c'est un pré-requis pour join) ?

    Si ce n'est pas le cas, tu y gagnerais à utiliser awk comme quelque chose du genre (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; 'FNR == NR {A[$1]=1;next};A[$1]' fichier_table.csv fichier_maitre.csv

  6. #6
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Juste une question: As-tu la garanti que tes fichiers sont préalablement triés (c'est un pré-requis pour join) ?

    Oui ils le sont.

  7. #7
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    j'ai râté un truc ?
    Non c'est tout bon !
    Je n'avais jamais utilisé cette option !

    Voici ce que j’obtiens avec l'option -j :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    join -11 -21 -t";" -j1 -o 1.1 1.2 fichier.csv table.csv > zf3.csv
     
    cat zf3.csv
    a1;present_fichier_ok
    a3;present_fichier_ok
    a5;present_fichier_ok
    a7;present_fichier_ok
    Si on résume, pour répondre à la question : Comment contrôler l'existence d'un enregistrement via une table (fichier faisant office de table), on peut :
    1/ utiliser la commande shell join avec l'option -j Toutefois attention à bien trier préalablement les fichiers à l'entrée de la commande shell join.
    2/ utiliser gwk ou awk (solution restant à tester sur le petit exemple)

    Un grand Merci à N_BaH et à disedorgue

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour

    Je pensais à la commande shell join pour faire cela.
    Pourquoi penses-tu à une commande de jointure lorsque tu veux faire un filtre ?

    On peut penser à grep, dont c'est la raison d'être.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@;.*@;@;s@^@^@' table.csv | grep -f - fichier.csv

  9. #9
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Bonjour Flodelarab,

    Effectivement, j'ai lancé la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's@;.*@;@;s@^@^@' table.csv | grep -f - fichier.csv
    en ligne de commande et le résultat attendu est le bon.

    Par contre je n'arrive pas à déchiffrer cette commande !

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 589
    Points : 19 474
    Points
    19 474
    Par défaut
    Citation Envoyé par Flodelarab
    Pourquoi penses-tu à une commande de jointure lorsque tu veux faire un filtre ?
    parce que, de fait, le résultat est une jointure, càd l'intersection des deux fichiers.

  11. #11
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Citation Envoyé par Liamm Voir le message
    Par contre je n'arrive pas à déchiffrer cette commande !
    grep motif fichier filtre les lignes contenant motif dans fichier.
    grep -f fichier1 fichier2 filtre les lignes contenant les motifs de fichier1 dans fichier2.
    blablabla | grep -f - fichier2 filtre les lignes contenant les motifs venu de l'entrée standard dans fichier2. À ne pas confondre avec :
    blablabla | grep -f fichier1 - filtre les lignes contenant les motifs de fichier1 dans l'entrée standard.

    Dans les 2 derniers cas, l'entrée standard est la sortie standard de la commande précédente dans la conduite.

    Il y a des champs surnuméraires dans la table, on utilise donc sed pour modifier le fichier texte. On supprime tout ce qui est au-delà du premier point-virgule, et on remplace le début de ligne par un accent circonflexe. Ainsi, le fichier de table est transformé en fichier de motifs pour filtrer le fichier "maître". Tous les motifs sont des expressions rationnelles.

  12. #12
    Membre régulier Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 160
    Points : 80
    Points
    80
    Par défaut
    Vu, merci Flodelarab

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Vérifier l'existence d'une table dans une base de données
    Par mounim_taoufik dans le forum Administration
    Réponses: 8
    Dernier message: 02/03/2010, 16h24
  2. Tester l'existence d'une table dans un fichier lié
    Par Stargate SG1 dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/06/2009, 18h16
  3. [MySQL] Tester l'existance d'une table dans une base de données
    Par méphistopheles dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/12/2006, 19h27
  4. test d'existence d'une table dans une bd mysql
    Par kafana dans le forum JDBC
    Réponses: 5
    Dernier message: 25/03/2006, 21h19
  5. vérifier l'existance d'une table dans une base de donnée
    Par zidenne dans le forum Bases de données
    Réponses: 1
    Dernier message: 31/10/2005, 11h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo