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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    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 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,
    une table contenant tous les identifiants autorisés
    alors pourquoi la table contient-elle d'autres "identifiants" ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    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 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    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 ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 360
    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 360
    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 confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    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 confirmé Avatar de Liamm
    Femme Profil pro
    Enseignant
    Inscrit en
    Janvier 2019
    Messages
    164
    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 : 164
    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 confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    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

+ 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