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 :

Enlever les doublons dans un tableau de chaine de caractères


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Enlever les doublons dans un tableau de chaine de caractères
    Bonjour à tous ,

    J'ai un fichier dont chaque ligne contient un mot, j'ai récupéré le contenu de ce fichier dans un tableau et j'ai essayé de supprimer les doublons , j'ai essayé ce code mais toujours il y a des problèmes
    voilà le 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
     @Ti = <F>;
     
     my @unique = ();
      my %dejavu = ();
     
      foreach my $elem ( @Ti )
        {
    	 chomp(@Ti);
          next if $dejavu{ $elem }++;
          push @unique, $elem;
        }
     
     
     
     
    foreach my $val ( @unique ) {
     
     
    	print FIC "$val\n"; 
    	}
    Merci de m'aider je serai très reconnaissante

  2. #2
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Plusieurs solutions se présentent à toi :

    le module list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        use List::MoreUtils qw(uniq);
    my @unique= uniq @Ti;
    sinon utilises le fait que dans une hash, il est impossible d'avoir des doublons dans les clés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my %uniques;
    foreach my $elem ( @Ti ){
        $uniques{$Elem}++;
    }
    foreach my $k (keys(%uniques)) {
    print "Clef=$k Nombre de répétitions=$uniques{$k}\n";
    	}

  3. #3
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Supprimer les doublons dans un tableau des chaines
    J'ai essayé les deux solutions mais aucune n'est valide...

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Alors tu as mal essayé. Les deux solutions marchent. En particulier, l'utilisation d'un hash pour dédoublonner une liste est un grand classique.

    Poste le code que tu as produit et qui n'a pas marché.

  5. #5
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut supprimer les doublons dans un tableau de chaine
    j'ai essayé ce 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
     
    @Ti = <F>;
    use List::MoreUtils qw(uniq);
    my @unique= uniq @Ti;
     
     #my @unique = ();
      my %dejavu = ();
    chomp(@Ti);
      foreach my $elem ( @Ti )
        {
    	 chomp(@Ti);
     
          next if $dejavu{ $elem }++;
          push @unique, $elem;
        }
     
    foreach my $val ( @unique ) {
     
     
    	print FIC "$val\n"; 
    	}

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Le principal problème est que, dans la solution qui t'a été proposée, unique est un hash, tu en fais un tableau. De coup, ça ne sert à rien. De plus, tu testes dans le hasg déjavu, mais ajoute dans le tableau unique? Ce ne doit être qu'une seule structure de données.

    Sur la solution utilisant un hash, essaie ceci (proposition rapide, pas testée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Ti = <F>;
    my %dejavu;
    chomp(@Ti);
    foreach my $elem ( @Ti )
    {
         $dejavu{$elem} = 1;
    }
    # le hash déjavu contient maintenant une liste dédoublonnée des éléments,
    # il suffit de l'utiliser selon les besoins. Par exemple:
    print $_, "\n" foreach keys %dejavu

  7. #7
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Suppression des doublons
    C'est toujours le meme problème

  8. #8
    Membre du Club
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Points : 63
    Points
    63
    Par défaut
    Je viens de tester le script de lolo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Ti = (0,1,2,2,3,4,6,5,7,8,7,8,7,4,5,4,6,1,2,4);
    my %dejavu;
    chomp(@Ti);
    foreach my $elem ( @Ti )
    {
         $dejavu{$elem} = 1;
    }
    # le hash déjavu contient maintenant une liste dédoublonnée des éléments,
    # il suffit de l'utiliser selon les besoins. Par exemple:
    print $_, "\n" foreach keys %dejavu
    cela m'a donné comme résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    6
    3
    7
    2
    8
    1
    4
    0
    5
    Donc cela semble marcher. Le seul problème que je peux imaginer, c'est dans tes données sources. Peux tu nous montrer quelques lignes de ton <F> s'il te plait ?
    Un exemple de résultat serait pas mal aussi (ce que tu veux, et ce que tu obtiens à l'heure actuelle)

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Oui, montre tes données en entrée, et aussi les données produites.

  10. #10
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Suppression des doublons dans un tableau
    Mon fichier F contient les lignes suivantes :
    أي
    تفضل
    خويا
    مع
    وقتاش
    بلله
    إي
    إي
    تفضل
    تفضل
    تفضل
    أي
    أي

    voici mon 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
     
    open(F,'E:\\Mastère_2013\\Script\\IN.txt') or die ("Erreur d'ouverture ") ;
    open(FIC,'>E:\\Mastère_2013\\Script\\OUT.txt') or die ("Erreur de creation ") ;
     
    @Ti = <F>;
     
      my @unique = ();
      my %dejavu = ();
      chomp(@Ti);
      foreach my $elem ( @Ti )
        {
    	  chomp($elem );
     
          next if $dejavu{ $elem }++;
     
          push @unique, $elem;
        }
     
      foreach my $val ( @unique ) 
        {
     
    	   print FIC "$val\n"; 
    	   print  "$val\n"; 
    	}
    et le résultat est le suivant :
    أي
    تفضل
    خويا
    مع
    وقتاش
    بلله
    إي
    أي

  11. #11
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Enlever les doublons
    Le problème lorsque je fait l'affichage sur invite de commandes il y a ajout des caractères aux quelques mots c'est pourquoi les deux mots n'apparaissent pas identiques... Alors quelle est la solution et d'ou vient ce problème ??

  12. #12
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Ton algorithme est faux et tu ne tiens pas des conseils que j'ai donnés.

    Tu ne remplis à aucun moment le hash %dejavu, tu ne risques pasqd'identifier les doublons. Et le tableau @unique ne sert à rien, sauf si tu veux restituer les éléments dans l'ordre dans lequel tu les as rencontrés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      @Ti = <F>;
      my %dejavu = ();
      chomp(@Ti);
      $dejavu{$_} = 1 foreach ( @Ti );
      print $_, "\n" foreach keys %dejavu;

  13. #13
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Suppression des doublons
    Bonjour,
    Merci pour votre réponse , j'ai utilisé ton algorithme mais toujours le meme problème...

    voila mes données en entrée :
    bonjour
    bonsoir
    bonsoir
    madame
    bonjour
    madame

    et voila le résultat:

    madame
    bonsoir
    bonjour
    bonjour

    comme vous constatez il y a ajout des caractères pour le mot bonjour !!!! (bonjour)

  14. #14
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 91
    Points
    91
    Par défaut
    serait-ce le caractère BOM ? Vuque tu utilises l'arabe, ton fichier doit être en utf8 ou utf16.
    il va alors falloir rajouter une regex pour supprimer ce caractère.
    Saaaaluuut Nounou!!

  15. #15
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Suppression des doublons
    Meme lorsque j'utilise le français c'est le meme problème , comment utiliser regex?

  16. #16
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Décembre 2012
    Messages : 43
    Points : 91
    Points
    91
    Par défaut
    je reprend le code de Lolo en le modificant un peu pour que ce soit plus explicite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Ti = <F>;
    my %dejavu = ();
     
    foreach my $line (@TI) {
       chomp( $line );
       $line =~ s/^\x{FEFF}//; # strip BOM
       $dejavu{ $line } = 1;
    }
    #Affichage
    print $_, "\n" foreach keys %dejavu;
    Saaaaluuut Nounou!!

  17. #17
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    En français:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @Ti = qw /bonjour bonsoir bonsoir madame bonjour madame bonsoir madame /;
    my %dejavu;
    chomp(@Ti);
    $dejavu{$_} = 1 foreach ( @Ti );
    print $_, "\n" foreach keys %dejavu;
    Ce qui m'imprime:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    madame
    bonsoir
    bonjour
    Donc, ça marche en français. Peut-être y a-t-il des caractères parasites dans ton fichier en français, ou un encodage particulier, je ne sais pas.

    Après, pour les particularités en arabe s'il y en a, je ne peux pas t'aider.

  18. #18
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Suppression des doublons
    Bonsoir,
    en fin j'ai trouvé une solution à mon problème ,
    le code est le suivant :
    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
     
     
     
     
    open(F,'E:\\Mastère_2013\\Script\\IN6.txt') or die ("Erreur d'ouverture ") ;
     
    open(FIC,'>E:\\Mastère_2013\\Script\\OUT.txt') or die ("Erreur de creation ") ;
     
    @Ti = <F>;
    close F;
    my $line = shift @Ti; 
    $line =~ s/^\x{ef}\x{bb}\x{bf}//; #retire la BOM UTF-8 de début de fichier 
    unshift @Ti, $line; 
    map {chomp; s/(^\s*|\s*$)//g} @Ti; 
     
    my %dejavu;
     
    foreach my $elem ( @Ti )
    {
         $dejavu{$elem} = 1;
    }
    #print $_ , "\n" foreach keys %dejavu
     
    print FIC $_ , "\n" foreach keys %dejavu
    Le seul problème qu'avec cette solution j'ai perdu l'ordre des mots qui se trouve dans le fichier d'entré , alors y'a t'il une solution à ce problème ??
    Merci d'avance

  19. #19
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Si tu veux préserver l'ordre, il faut garder un tableau des éléments dédoublonnés en plus du hash. Modifie comme suit la partie concernée du code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    my (%dejavu, @unique);
     
    foreach my $elem ( @Ti )
    {
         push @unique, $elem unless defined $dejavu{$elem} ;
         $dejavu{$elem} = 1;
    }
     
    print FIC $_ , "\n" foreach @unique;

  20. #20
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 128
    Points : 43
    Points
    43
    Par défaut Suppression des doublons
    Bonsoir ,
    En fin j'ai résolu mon problème merci pour vos aides .

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Enlever les doublons dans un tableau
    Par supertoms dans le forum VBA Access
    Réponses: 4
    Dernier message: 02/06/2008, 23h43
  2. Enlever les doublons dans une liste
    Par gefrey54 dans le forum Powerbuilder
    Réponses: 2
    Dernier message: 14/09/2007, 17h46
  3. Réponses: 3
    Dernier message: 19/03/2007, 18h29
  4. [Tableaux] Rechercher les doublons dans un tableau
    Par jym_22 dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2006, 09h47
  5. Eliminer les doublons dans un tableau d'entiers
    Par engi dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 21/03/2006, 13h59

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