1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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 : 62
    Points
    62

    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
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    Par défaut Supprimer les doublons dans un tableau des chaines

    J'ai essayé les deux solutions mais aucune n'est valide...

  4. #4
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 677
    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 : 1 677
    Points : 4 315
    Points
    4 315
    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é.
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  5. #5
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 677
    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 : 1 677
    Points : 4 315
    Points
    4 315
    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
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  7. #7
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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 : 62
    Points
    62

    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
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 677
    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 : 1 677
    Points : 4 315
    Points
    4 315
    Billets dans le blog
    1

    Par défaut

    Oui, montre tes données en entrée, et aussi les données produites.
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  10. #10
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 677
    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 : 1 677
    Points : 4 315
    Points
    4 315
    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;
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  13. #13
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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 : 90
    Points
    90

    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.

  15. #15
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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 : 90
    Points
    90

    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;

  17. #17
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 677
    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 : 1 677
    Points : 4 315
    Points
    4 315
    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.
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  18. #18
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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
    Expert Confirmé Sénior


    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    1 677
    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 : 1 677
    Points : 4 315
    Points
    4 315
    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;
    Articles sur La programmation fonctionnelle en Perl : 1. les opérateurs de liste; 2. les fonctions d'ordre supérieur; 3. étendre le langage.
    Tutoriels De Perl 5 à Perl 6: 1. Les bases du langage; 2. Les nouveautés.

    ________
    Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés.

  20. #20
    Candidat au titre de Membre du Club
    Inscrit en
    avril 2009
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : avril 2009
    Messages : 113
    Points : 11
    Points
    11

    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

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