Soutenez-nous
Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 21
  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 :
    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 :
    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    988
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 988
    Points : 2 139
    Points
    2 139

    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é.
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    988
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 988
    Points : 2 139
    Points
    2 139

    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 :
    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
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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 :
    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    988
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 988
    Points : 2 139
    Points
    2 139

    Par défaut

    Oui, montre tes données en entrée, et aussi les données produites.
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    988
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 988
    Points : 2 139
    Points
    2 139

    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 :
    1
    2
    3
    4
    5
      @Ti = <F>;
      my %dejavu = ();
      chomp(@Ti);
      $dejavu{$_} = 1 foreach ( @Ti );
      print $_, "\n" foreach keys %dejavu;
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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 Jean Michel
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean Michel
    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 Jean Michel
    Ingénieur intégration
    Inscrit en
    décembre 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean Michel
    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    988
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 988
    Points : 2 139
    Points
    2 139

    Par défaut

    En français:

    Code :
    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 :
    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.
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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 :
    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
    Membre Expert

    Homme Profil pro Laurent R.
    Conseil - Consultant en systèmes d'information
    Inscrit en
    mai 2012
    Messages
    988
    Détails du profil
    Informations personnelles :
    Nom : Homme Laurent R.
    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 : 988
    Points : 2 139
    Points
    2 139

    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 :
    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;
    Mes articles sur ce site: La programmation fonctionnelle en Perl - Partie 1: les opérateurs de liste et La programmation fonctionnelle en Perl - Partie 2: les fonctions d'ordre supérieur
    ______

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •