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 :

[Problème] Suppression de doublons pour grep


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut [Problème] Suppression de doublons pour grep
    Bonjour à tous,

    Ici mon script :
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    #!/usr/bin/perl -w
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my $InFile = "ENT_PROF.csv";
    open (InFile,"$InFile") or die "Can't open file\n";
    my $Ligne;
    my %Table;
     
    # Professeur_Nom;Professeur_Prenom;Classes;Matiere
    # lecture du fichier ligne par ligne
    while ($Ligne=<InFile>)
    {
    # lecture d'un fichier à partir de la 1er ligne
        if ($. >= 2)
        {
            if($Ligne =~ /(.*);(.*);(.*);(.*)/)
            {
                print $Ligne."\n";
                #my $cle = $1."_".$2."\n";
                my $cle = "$1_$2";
                push(@{$Table{$cle}{Classes}}, $3);
                push(@{$Table{$cle}{Matiere}}, $4);
            }
            else
            {
                print("Erreur lecture de ligne : $.");
            }
        }
    }
    close(InFile);
     
    # pour visualiser ton tableau globalement
    # print Dumper (%Table);
     
    # Pour accéder à une valeur bien spécifique du tableau  
    foreach my $Nom_Prenom (keys %Table)
    {
            print "\n\nNOM PRENOM = " .$Nom_Prenom."\n";
            for(my $i=0; $i<@{$Table{$Nom_Prenom}{Classes}}; $i++)
            {
                    print "Classes\t".${$Table{$Nom_Prenom}{Classes}}[$i]."\n";
                    print "Matiere\t".${$Table{$Nom_Prenom}{Matiere}}[$i]."\n";
            }
            print "\n";
    }
    my @Table = keys(%Table);    # ATTENTION : %Table = hachage !
    my @s =undef;
    @s = grep ( /MARTIN_RENE/i, @Table);
    print @s;
     
    if (@s)       # on a bien récupéré quelque chose sur le nom recherché
    {
        print "\n\nListe des matières :\n";
        foreach(@{$Table{MARTIN_RENE}{Matiere}})
        {
            print "$_\n";
        }
     
        print "\nListe des classes :\n";
        foreach(@{$Table{MARTIN_RENE}{Classes}})
        {
            print "$_\n";
        }
    }
    les lignes en question :
    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
     
    my @Table = keys(%Table);    # ATTENTION : %Table = hachage !
    my @s =undef;
    @s = grep ( /MARTIN_RENE/i, @Table);
    print @s;
     
    if (@s)       # on a bien récupéré quelque chose sur le nom recherché
    {
        print "\n\nListe des matières :\n";
        foreach(@{$Table{MARTIN_RENE}{Matiere}})
        {
            print "$_\n";
        }
     
        print "\nListe des classes :\n";
        foreach(@{$Table{MARTIN_RENE}{Classes}})
        {
            print "$_\n";
        }
    }
    Le résultat ce ces lignes :
    MARTIN_RENE

    Liste des matières :
    Informatique
    Informatique
    Informatique materiel
    Informatique bureautique

    Liste des classes :
    1 ANG
    T ANG
    2 A
    2 A
    La question :
    Est-ce possible de supprimer les doublons pour classe et matière

    D'avance merci,
    Maloute.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    et bien quel retour éclair ... nous te manquions déjà?

    Pour ce qui concerne les doublons fais une recherche sur le forum, c'est une question qui revient très très souvent.


    Jasmine,
    -- Jasmine --

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Essaie cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my %instances;
    map{$instances{$_}} @{$Table{"MARTIN_RENE"}{classes}};
    foreach my $classes (keys %instances){print $classes."\n";}
    Jasmine,
    -- Jasmine --

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    et bien quel retour éclair ... nous te manquions déjà?
    Et oui déjà je peut pas encore partir du nid comme ça

    Question 1:
    pour cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map{$instances{$_}} @{$Table{"MARTIN_RENE"}{classes}};
    classes correspond à cette ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push(@{$Table{$cle}{Classes}}, $3);
    Question 2:
    pour cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $classes (keys %instances){print $classes."\n";}
    ces une nouvelle variable classe qui ne correspond pas du tout a la ligne au dessus?

    car je n'affiche rien donc j'ai remplacer classes par Classes mais toujours rien!!

    D'avance merci,
    Maloute.

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    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 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Citation Envoyé par maloute80 Voir le message
    car je n'affiche rien donc j'ai remplacer classes par Classes mais toujours rien!!
    Attention, jeune Jedi

    Comme je te le disais dans un autre sujet, Perl est sensible à la casse et ton hachage %Table pourrait très bien avoir 2 clés distinctes appelées "Classes" et "classes" sans que ça le gêne particulièrement.

    Donc si ta clé actuelle est "Classes", c'est bien "Classes" que tu dois prendre en compte.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Oui je comprend bien maitre jedi_perl Arioch comme vous m'avait enseigner j'ai remplacer pour la casse ce que ma donner le maitre jedi_perl Jasmine80 ce qui donne cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my %instances;
    map{$instances{$_}} @{$Table{"MARTIN_RENE"}{Classes}};
    foreach my $Classes (keys %instances){print $Classes."\n";}
    mais rien ne s'affiche oO peut être Erreur j'ai fait ?

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Question 1:
    pour cette ligne

    map{$instances{$_}} @{$Table{"MARTIN_RENE"}{classes}};classes correspond à cette ligne ?

    push(@{$Table{$cle}{Classes}}, $3);

    L'action de {$instances{$_}} qui consiste à ajouter $_ en clé au tableau non indexé %instance est appliquée à toutes les valeurs du tableau indexé @{$Table{"MARTIN_RENE"}{classes}} qui ne contient que les valeurs de classes de Martin Rene.
    http://perl.enstimac.fr/DocFr/perlfunc.html#item_map

    S'il te plait, donne moi une partie de fichier contenant des doublons pour Martin Rene que je puisse essayer de comprendre ce qui ne fonctionne pas.

    Merci,


    Jasmine,
    -- Jasmine --

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    voici l'extrait du fichier .txt pour MARTIN_RENE

    MARTIN;RENE;1 ANG;Informatique
    MARTIN;RENE;T ANG;Informatique
    MARTIN;RENE;2 A;Informatique materiel
    MARTIN;RENE;2 A;Informatique bureautique
    Résultat souhaiter :
    MARTIN_RENE

    Liste des matières :
    Informatique
    Informatique materiel
    Informatique bureautique

    Liste des classes :
    1 ANG
    T ANG
    2 A

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    print "NETTOYAGE des classes de Martin Rene\n";
     
    my %instances =();
    map{$instances{$_}=""} @{$Table{"MARTIN_RENE"}{Classes}};
    foreach my $classes (keys %instances){print "==> ".$classes."\n";}
    ... il y a peut être moyen, de faire mieux, mais ça fonctionne maintenant.


    Jasmine,
    -- Jasmine --

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    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 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Essaie ceci à la fin de ton code :

    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
    my %Classe;
    my %Matiere;
     
    foreach(@{$Table{"MARTIN_RENE"}{Classes}})
    {
        ++$Classe{$_};
    }
    foreach(@{$Table{"MARTIN_RENE"}{Matieres}})
    {
        ++$Matiere{$_};
    }
     
    print "MARTIN_RENE\n\n";
     
    print "Liste des matières :\n";
    foreach(keys %Matiere)
    {
        print "$_\n";
    }
    print "\nListe des classes :\n";
    foreach(keys %Classe)
    {
        print "$_\n";
    }

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    Résultat Jasmine :
    NETTOYAGE des classes de Martin Rene
    ==> 1 ANG
    ==> T ANG
    ==> 2 A
    Résultat Arioch :
    MARTIN_RENE

    Liste des matières :

    Liste des classes :
    2
    1
    1
    ce qui doit coresspondre à :
    2=>2 A
    1=>1 ANG
    1=>T ANG

    Merci encore à vous deux pour tout votre aide fournit avec soins et gentillesse

  12. #12
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    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 572
    Points : 2 014
    Points
    2 014
    Par défaut
    J'ai corrigé mon code juste au-dessus de ta réponse.

    Je m'étais effectivement planté en affichant la valeur des clés au lieu d'afficher les clés elles-mêmes

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 98
    Points : 26
    Points
    26
    Par défaut
    j'ai corriger une erreur de frappe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach(@{$Table{"MARTIN_RENE"}{Matiere}})
    {
        ++$Matiere{$_};
    }
    pas de "s" à Matiere c'est pour cela que je n'afficher rien pour celui-ci

    Un jour le padawan dépassera le maitre

    Merci à vous, dans les deux cas mon problème est résolu.

    A très bientôt,
    cordialement,
    Maloute.
    (Une personne qui vous veut du bien)

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 02/01/2012, 18h38
  2. Suppression de doublons pour regroupement
    Par PAYASS59 dans le forum Webi
    Réponses: 7
    Dernier message: 03/11/2010, 16h08
  3. Réponses: 2
    Dernier message: 29/04/2010, 16h50
  4. Probleme pour suppression de doublons uniques
    Par Bimboboumbo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/12/2008, 15h46
  5. problème avec la suppression des doublons dans arraylsit
    Par ulysse031 dans le forum Langage
    Réponses: 13
    Dernier message: 04/03/2007, 12h52

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