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 :

Remplacer des mots dans un fichier par des nombres


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Points : 51
    Points
    51
    Par défaut Remplacer des mots dans un fichier par des nombres
    Bonjour à tous,
    Je me remets à perl, et mon objectif est de remplacer les mots d'un fichier par des nombre (un même nombre pour un même mot).
    Exemple:
    Le fichier contenant:

    Doit désormais contenir:

    Du coup, j'ai pensé à passer par une hashmap, et faire un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    %dico=();
    while ($l=<FILEIN>) {
        my @motsparligne=split(/[\W]/,$l);
        foreach my $mot (@motsparligne) {
                $taille = keys(%dico);
    	    if (!(%dico{$mot})) {
    	    $dico{$mot}=$taille;
    		}
    	}
    }
    Ce qui devrait à priori me donner une hashmap avec un nombre différent pour chaque mot rencontré. La suite serait de remplacer les mots du fichier.

    Je ne sais pas si je suis clair, aussi, je voulais vérifier qu'il n'y avait pas d'autres moyens, plus simples, pour réaliser cette tache avant de continuer

    Merci

  2. #2
    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 tes mots n'ont qu'une seule lettre comme dans ton exemple, alors la fonction tr/// est sans doute ce qu'il y a de mieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $input = "A B C D A B D A A";
    $input =~ tr/ABCD/1234/;
    print $input;  # imprime "1 2 3 4 1 2 4 1 1"
    Sinon, l'utilisation d'une table de hachage est sans doute une bonne solution. Mais je ne comprends pas bien la logique du code que tu as écrit. Est-ce que tu es en train de lire le fichier où tu veux faire des remplacements, ou un fichier de clefs à utiliser pour "chiffrer" un autre fichier?

    Ou peux-être veux-tu juste incrémenter un compteur pour chaque nouveau mot. Dans ce cas, j'utiliserais un compteur explicite, ce sera plus rapide que de remesurer la taille du hash à chaque fois et aussi plus lisible dans l'intention.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    my %dico;
    my $i = 0;
    while ($l=<FILEIN>) {
        my @motsparligne = split(/[\W]/,$l);
        foreach my $mot (@motsparligne) {
    	    $dico{$mot} = $i++ unless defined $dico{$mot};
       }
    }
    Mais dans ce cas, pourquoi ne pas coder ton texte immédiatement en faisant tout de suite la substitution dans le tableau @motsparligne?

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Points : 51
    Points
    51
    Par défaut
    Ta solution avec un compteur explicite me parait bonne (ce que je proposais était équivalent, si je ne me trompe).

    par contre l'idée est de pouvoir remplacer un texte qui contient de vrais mots (pas un simple caractère) par un ID par mot (si un mot apparaît deux fois, il doit apparaître en sortie deux fois avec le même ID). Le texte en entrée possède potentiellement des centaines de mots différents, donc pas de tr

    Mon problème est le suivant: une fois ma table de hachage remplie, je dois afficher en sortie mon texte en remplaçant chaque mot la valeur de son hash. un truc comme ça irait: ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #je parcours à nouveau mon fichier
    while ($l=<FILEIN2>) {
        my @motsparligne = split(/[\W]/,$l);
        foreach my $mot (@motsparligne) {
    	    print "$dico{$mot} " 
       }
    }

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Points : 51
    Points
    51
    Par défaut
    Je viens de tester, c'est bien ça.

    Merci lolo.

  5. #5
    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
    Citation Envoyé par bougnbie Voir le message
    Ta solution avec un compteur explicite me parait bonne (ce que je proposais était équivalent, si je ne me trompe).
    Oui, c'est équivalent, mais c'est plus rapide (si le texte est très long et qu'il y a beaucoup de mots, calculer le nombre d'éléments dans le hash est une perte de temps) et l'intention du code me parait plus explicite (j'ai mis quelques minutes à comprendre ce que tu essayais de faire).

    Sinon, si ce que tu as convient, très bien, mais j'éviterais personnellement de lire le fichier deux fois et je ferais la substitution immédiatement, en une seule passe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my %dico;
    my $i = 0;
    while ($l=<FILEIN>) {
        my @motsparligne = split(/[\W]/,$l);
        foreach my $mot (@motsparligne) {
            $dico{$mot} = $i++ unless defined $dico{$mot};
            $mot = $dico{$mot} ; # cette instruction remplace $mot par $dico{mot} dans le tableau @motsparligne
        }
        print join " ", @motsparligne, "\n";
    }
    Petit essai de la même syntaxe à la ligne de commande, avec une seule liste de mots:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my @a = qw/ toto titi tutu tata tutu tutu/;
    my %dico;
    foreach my $mot (@a) { 
         $dico{$mot} = $i++ unless defined $dico{$mot};
         $mot = $dico{$mot};
    }
    print join " ", @a;
    Ce qui imprime:


  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 51
    Points : 51
    Points
    51
    Par défaut
    Merci grandement encore une fois, c'est vrai que ton code est mieux foutu que le mien!
    Je fais à ta façon

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

Discussions similaires

  1. Comptage des mots dans un fichier PDF
    Par wafaa_H dans le forum Développement Web avec .NET
    Réponses: 4
    Dernier message: 05/06/2011, 22h50
  2. supprimer des mots dans un fichier
    Par belgariel dans le forum Administration système
    Réponses: 1
    Dernier message: 30/10/2009, 12h01
  3. Récupérer des accents dans un fichier par getline
    Par wistiti1234 dans le forum C++
    Réponses: 48
    Dernier message: 09/06/2008, 14h53
  4. remplacer des espaces dans un champ par des zero
    Par yeep dans le forum Access
    Réponses: 4
    Dernier message: 08/10/2004, 09h41
  5. Comment changer des mots dans un fichier?
    Par ptitbonum dans le forum Linux
    Réponses: 5
    Dernier message: 07/04/2004, 23h42

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