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

Langage Perl Discussion :

Filtrer un tableau


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut Filtrer un tableau
    Bonjour,
    J'ai une liste de données dans un tableau (@tabledef)). Je souhaite filtrer le tableau.

    Je crée donc un tableau que j'appelle @filtre.
    @filtre =("ABC", "AZE",RTY");

    J'utilise un foreach pour parcourir l'ensemble de ma table d'origine
    foreach my $elmttable(@tabledef){

    }

    Le problème est que je ne sais pas comment faire pour lui dire que si un élément de @filtre correspond à $elmttable alors je ne l'affiche pas.

    Une idée?
    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par Crosser02 Voir le message
    Une idée?
    Oui : utiliser un hash !

    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
    use strict;
    use warnings;
     
    my @tabledef = ("ta liste de données") ;
    my %filtre;
     
    # alimentation du hash des filtres
    foreach("ABC", "AZE","RTY") {
        $filtre{$_} = 1;
    }
     
    # on parcourt l'ensemble de la table d'origine
    foreach my $elmttable(@tabledef) {
        if (defined($filtre{$elmttable})) {
            print "$elmttable trouvé dans les filtres !\n";
        }
    }
    N'hésite pas à poser des questions si ce n'est pas clair.

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # alimentation du hash des filtres
    my %filtre = map { $_ => 1 } ("ABC", "AZE","RTY");
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # alimentation du hash des filtres
    foreach("ABC", "AZE","RTY") {
        $filtre{$_} = 1;
    }
    sans vouloir offenser Arioch

    ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use strict;
    use warnings;
     
    my @tabledef = ("ta liste de données") ;
    # alimentation du hash des filtres
    my %filtre = map { $_ => 1 } ("ABC", "AZE","RTY");
     
    # on parcourt l'ensemble de la table d'origine
    foreach my $elmttable(@tabledef) {
        if ( exists $filtre{$elmttable} ) {
            print "$elmttable trouvé dans les filtres !\n";
            last;
        }
    }

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par djibril Voir le message
    sans vouloir offenser Arioch
    Juste pour savoir : ta méthode est plus propre ou plus rapide que la mienne ou c'était juste pour vouloir m'offenser ?

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    les 3

  6. #6
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Il n'y aurait pas moyen de faire encore plus propre et plus rapide en utilisant grep ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Bonjour,
    Merci pour ces réponses.
    Je pensais que l'utilisation d'un simple tableau aurait fait l'affaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    use strict;
    use warnings;
     
    my @tabledef = qw / AZE ERT TYU UIO OPI /;
    my @filtre = qw / AZE ERT /;
     
    foreach my $elmtfiltre (@filtre){
        foreach my $elmtstable (@tabledef){
            unless($elmtstable =~ /(?:($elmtfiltre))/i){
                print "$elmtstable\n";
            }
        }
    }
    Cependant, lorsque le filtre ne contient qu'un élément, tout ce passe bien. Lorsqu'il contient deux éléments, les éléments restants sont affichés en double.
    Je ne peux donc pas utiliser un simple tableau?

    merci

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    si, il suffit de sortir de ta boucle quand tu trouves ce que tu veux

    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
    use strict;
    use warnings;
     
    my @tabledef = qw / AZE ERT TYU UIO OPI /;
    my @filtre = qw / AZE ERT /;
     
    foreach my $elmtfiltre (@filtre){
      BOUCLE2:    
      foreach my $elmtstable (@tabledef){
            unless($elmtstable =~ /(?:($elmtfiltre))/i){
                print "$elmtstable\n";
                last BOUCLE2;
            }
        }
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Salut,
    Merci djibril pour la réponse. Mais ce n'est pas exactement ce que je voulais faire.
    En fait, le but de mon filtrage est de retirer les éléments présents dans le filtre et de garder les autres.
    Mon but est d'avoir beaucoup d'éléments à filtrer (présents dans @tabledef), de choisir dans @filtre les éléments à retirer et d'afficher les éléments restants (ce qui sont différents du filtre).
    Une autre idée?

  10. #10
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Pour, je te recommande de re expliquer ce que tu veux concrètement via un exemple.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Désolé de m'être expliqué comme un pied

    Donc :
    -J'ai un tableau @tabledef qui contient mes données brutes.
    -Je souhaite filtrer les éléments de @tabledef dans le but de les retirer (pas forcément de les supprimer mais de les mettre de côté)
    -Je crée donc mon tableau de filtrage @filtre
    -Lorsque les éléments de @tabledef sont différents de @filtre, je les affiche.
    -Si des éléments entre @tabledef et @filtre correspondent, je ne veux pas qu'ils soient affichés.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my @tabledef = qw / homer marge bart lisa maggi krusty barney /; #tableau brut
    my @filtre = qw / homer lisa /; #données à retirer
     
    Je souhaite que le programme m'affiche les données restantes à savoir : marge bart maggi krusty barney
    J'espère avoir bien expliqué

    Merci

  12. #12
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Donc :
    -J'ai un tableau @tabledef qui contient mes données brutes.
    -Je souhaite filtrer les éléments de @tabledef dans le but de les retirer (pas forcément de les supprimer mais de les mettre de côté)
    -Je crée donc mon tableau de filtrage @filtre
    -Lorsque les éléments de @tabledef sont différents de @filtre, je les affiche.
    -Si des éléments entre @tabledef et @filtre correspondent, je ne veux pas qu'ils soient affichés.
    Pensez aussi aux modules : List::Compare et List::AllUtils


    Par exemple, si chaque élément de @tabledef a une valeur unique :
    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
     
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    use List::Compare;
     
     
    my @filtre = ("ABC", "AZE", "RTY"); 
    my @tabledef;  
     
     
    my $lc = List::Compare->new(\@tabledef, \@filtre);
     
    # liste des différents éléments qui n'apparaissent que dans @tabledef
    my @Lonly = $lc->get_unique;
     
    # affichage
    map {print "$_\n";} @Lonly;

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Bonjour Jasmine80, merci pour la réponse.
    Le module et le programme que tu m'as donné fonctionnent avec l'exemple. (supposons @tabledef=/"ABC 1", "POP", "UIO", "AZE" /; )
    Il ne m'affiche pas "AZE" cependant, il m'affiche "ABC 1".
    Que faire?

  14. #14
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Crosser02 Voir le message
    Bonjour Jasmine80, merci pour la réponse.
    Le module et le programme que tu m'as donné fonctionnent avec l'exemple. (supposons @tabledef=/"ABC 1", "POP", "UIO", "AZE" /; )
    Il ne m'affiche pas "AZE" cependant, il m'affiche "ABC 1".
    Que faire?
    C'est bien ce qu'il doit faire non? Etant donné que AZE est dans @filtre et que tu as dit qu'il ne faut afficher que ce qui est différent, AZE ne doit pas être affiché.
    Citation Envoyé par Crosser02 Voir le message
    -Lorsque les éléments de @tabledef sont différents de @filtre, je les affiche.
    -Si des éléments entre @tabledef et @filtre correspondent, je ne veux pas qu'ils soient affichés.

    Le mieux est que tu regardes les différentes fonctions de ces 2 modules et que tu trouves celle qui te convient.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Oui, il ne m'affiche pas "AZE" et c'est bien ce que je veux.
    Cependant, il m'affiche "ABC 1" alors que "ABC" doit être filtré.
    Il n'aurait pas dû m'afficher la ligne avec ABC 1 non?

  16. #16
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl
    use warnings;
    use strict;
    use List::Compare;
     
    my @tabledef = qw / homer marge bart lisa maggi krusty barney /; #tableau brut
    my @filtre = qw / homer lisa /; #données à retirer
     
     
    my $lc = List::Compare->new(\@filtre, \@tabledef);
     
    # liste des différents éléments qui n'apparaissent que dans @tabledef
    my @res = $lc->get_complement;
    print "@res\n";

  17. #17
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Crosser02 Voir le message
    Il n'aurait pas dû m'afficher la ligne avec ABC 1 non?
    Je n'avais pas compris que tu considérais ABC 1 égal à ABC
    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
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
     
    use List::MoreUtils qw(indexes);
     
     
     
    my @filtre = ("ABC", "AZE", "RTY"); 
    my @tabledef = ();  
     
     
    # indexes des éléments récupérés de @tabledef 
    my @indexes_list;
     
    foreach my $f (@filtre ){
    	my @indexes = indexes{ $_ =~ m/$f/ } @tabledef;
    	push @indexes_list, @indexes;
    }
     
    # affichage
    map {print "$tabledef[$_]\n";} @indexes_list;

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Bonjour,
    Pour le moment, je laisse de côté les modules et je m'oriente vers la table de hash.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    use strict;
    use warnings;
     
    my @tabledef = ("ta liste de données") ;
    # alimentation du hash des filtres
    my %filtre = map { $_ => 1 } ("ABC", "AZE","RTY");
     
    # on parcourt l'ensemble de la table d'origine
    foreach my $elmttable(@tabledef) {
        if ( exists $filtre{$elmttable} ) {
            print "$elmttable trouvé dans les filtres !\n";
            last;
        }
    }
    Pour recherche un élément au début de chaque ligne d'un tableau, il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($elmttable =~ /(^(salut|bonjour)/i){}
    puisque c'est le ^ qui indique que la recherche est à réaliser au début (et $ à la fin).

    Comment faire pour dire au hash de ne regarder que le premier élément de chaque ligne de @tabledef? où mettre ^?

  19. #19
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Citation Envoyé par Crosser02 Voir le message
    Comment faire pour dire au hash de ne regarder que le premier élément de chaque ligne de @tabledef? où mettre ^?
    Je ne suis pas certaines que cette approche soit la meilleure ... tu sembles aimer compliquer les choses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $elmttable(@tabledef) {
        my ($first_word) = $elmttable =~ m/^(\w+)/;	
        if ( exists $filtre{$first_word } )

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 44
    Par défaut
    Bonjour,
    merci pour les réponses.
    Hier, je n'avais pas vu ta réponse Jasmine80 , c'est pour cela que j'avais mis de côté les modules.
    Je vais essayer de me simplifier la vie.
    Les éléments de @tabledef ne sont pas constitués d'un seul élément, il s'agit en général de plusieurs mots ou valeurs.
    C'est en regardant le premier élément, je souhaite être capable de le filtrer.
    C'est pour cela que je considère que 'ABC' est équivalent à 'ABC 1'.
    Je vais regarder cela attentivement.
    Merci

Discussions similaires

  1. Filtrer un tableau et non une requette
    Par mederik dans le forum Cognos
    Réponses: 4
    Dernier message: 07/03/2018, 17h04
  2. Filtrer un tableau croisé dynamique
    Par jijie dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/05/2009, 20h07
  3. [PHP 5.2] [POO] Filtrer un tableau sur un certain champ
    Par beegees dans le forum Langage
    Réponses: 8
    Dernier message: 10/05/2009, 13h36
  4. Filtrer un tableau croisé
    Par moumoune65 dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 10/12/2008, 14h22
  5. Filtrer un tableau de données
    Par Yux dans le forum Langage
    Réponses: 12
    Dernier message: 13/10/2005, 22h21

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