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 :

Rechercher les element d'une liste dans une autre liste


Sujet :

Langage Perl

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Bonjour à tous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($verbe,$liste_synonyme) = split /:/,$_,2;
    Le 2 correspond à quoi exactement

    Aussi non merci pour les différentes réponses
    Mais pour l'instant je vais rester sur mes listes pour obtenir mon résultat puisque je dois créer un fichier qui est de la meme forme que le dictionnaire de départ
    amicalement fessebleu

  2. #22
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par fessebleu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my ($verbe,$liste_synonyme) = split /:/,$_,2;
    Le 2 correspond à quoi exactement
    Regarde ici http://perl.enstimac.fr/DocFr/perlfunc.html#item_split

    lami20j
    --
    lami20j

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    lami20j , je trouve interessant ta facon de traiter la premiere partie de de mon programme

    Si j'ai bien compris tu regarde d'abord dans l'ensemble du fichier si la vedette principale apparait dans la liste des synonymes des autres vedettes.
    Il me faut dans une deuxieme partie conserver tous les synonymes d'une vedette qui seront identiques aux synonymes de ma vedette principale.

    Pour l'instant j'utilise les foreach.
    Mais je vais devoir au maximum optimiser mon code car je risque de traiter un fichier de plus de 50000 lignes

    Est ce qu'il faut mieux que je crée une fonction qui permet de comparer l'ensemble des synonymes et qui me renvoie la liste des synonymes identiques et dans ce cas la j'utilise ta premiere partie pour obtenir l'ensemble des vedettes qui ont comme synonymes ma vedette principale?

    Ou est ce qu'il faut mieux traiter en meme temps, c'est à dire je récupére une vedtte et je compare tout de suite les synonymes?

    Le mieux étant de simplier le cout( et donc le temps de calcul)
    Encore merci pour votre aide

    Fessebleu

    ps : je viens au début de forum pour l'optimisation de script alors excusez moi pour la question

  4. #24
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut

    Citation Envoyé par fessebleu
    Si j'ai bien compris tu regarde d'abord dans l'ensemble du fichier si la vedette principale apparait dans la liste des synonymes des autres vedettes.
    Il me faut dans une deuxieme partie conserver tous les synonymes d'une vedette qui seront identiques aux synonymes de ma vedette principale.
    Oui pour la 1ère phrase.

    En ce qui concerne la conservation des synonymes c'est cette partie du code qui le fait mais seulement pour le verbe à consulter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $vv ( @{$result_verbe{$v}} ) {
      push  @affiche, grep { /$vv/ } @{$total_verbe{$vedette_p}};
    }
    En fait ce n'est qu'une autre façon de voir les choses. Je n'ai pas traité au niveau global puisque j'ai supposé qu'une fois que tu as le fichier dico.txt en fait le but c'est de consulter le minidico dont tu parles.
    Donc je n'ai pas trouver nécessaire de sauvegarder carrément le minidico dans un autre fichier.

    Tu pourra dire que tu n'auras pas toujours le fichier dico.txt donc une raison pour sauvegarder ton minidico (c'est une supposition).
    En ce cas tu peux ajouter ton dico text après le tag __END__ et utiliser le handle DATA pour le lire.

    50.000 ligne ce n'est pas beaucoup.

    Si tu est obligé de sauvegarder ton minidico est en raison des performances je peux essayer de peaufiner le script que j'ai commencé pendant que tu essaie de ton côté mais pour ça j'aimerais avoir ton fichier de 50.000 lignes.

    Pour info, j'ai traité des fichiers de plus de 1.000.000 lignes et je n'ai pas eu des problèmes. Il faut aussi tenir compte de la configuration de pc mais on peut toujours tester et améliorer.

    lami20j
    --
    lami20j

  5. #25
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Je met en ligne le morceau du programme que j'ai fait pour avoir ton avis lami20j
    Fichiers attachés Fichiers attachés

  6. #26
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par fessebleu
    Je met en ligne le morceau du programme que j'ai fait pour avoir ton avis lami20j
    J'ai lu ton code et je l'exécuter, donc je vois que tu obtiens ce que tu veux.

    En revanche la façon de l'obtenir ce n'est pas vraiment propre.
    Il faut faire un peu de menage dans ton code.
    Il faut aussi imposer un peu de discipline
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    use warnings;use  strict;
    et tu auras des surprises.

    J'ai vue que tu as ouvert le handle DICO pour le parcourir avec while et ensuite tu l'as fermer pour l'ouvrir de nouveau. Pas besoin. Une fois ouvert dans la boucle while tu fait tous les traitements.

    Vu que tu utilise 3 arguments alors j'ai fait 2 fois pop sur @ARGV comme ça un est suffisant.

    Je n'ai rien changé dans ton algorithme. J'ai seulement réécrit le code dans une autre manière.
    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
    #!/usr/bin/perl 
    use warnings; use strict; 
     
    die "Usage : script fichier_en_entree verbe fichier_en_sortie\n" 
      if @ARGV != 3; 
     
    my $syn = "./" . pop @ARGV; 
    my $vedetteprincipale = pop @ARGV; 
     
    my (%tmp_vs,%ved_syn); 
    my (@synvedetteprinci,@res2,@res3,); 
    my ($synvedette,$synotmp,); 
     
    while (<>){ 
      my ($vedette,$synons)=split /:/,$_; 
      if($vedette eq $vedetteprincipale){ 
         @synvedetteprinci =  split/,/,$synons; 
      } 
      $tmp_vs{$vedette} = $synons; 
      $ved_syn{$vedette} = $tmp_vs{$vedette}; 
    } 
     
    while ( my ($local_ved,$local_syno) = each %ved_syn ){ 
      my @local_syno2=split /,/,$local_syno; 
         foreach $synotmp (@local_syno2){ 
         my @res=(); 
            foreach $synvedette (@synvedetteprinci){ 
               $synvedette eq $synotmp && push @res, $synvedette; 
            } 
            @res && push @res2,@res; 
         } 
         @res2 && (@res2 = join(",",@res2)) 
               && push(@res3,$local_ved,":",@res2,"\n"); 
      @res2=(); 
    } 
    open SYN,">$syn" or die "E/S : $!"; 
    print SYN @res3 and close SYN;
    Et le résultat
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware_fessebleu.pl dico.txt suivre
    Usage : script fichier_en_entree verbe fichier_en_sortie
    lami20j@debian:~/bin/my_deb_perl$ cat resultat_dico.txt
    cat: resultat_dico.txt: Aucun fichier ou répertoire de ce type
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware_fessebleu.pl dico.txt suivre resultat_dico.txt
    lami20j@debian:~/bin/my_deb_perl$ cat resultat_dico.txt
    se maintenir:tenir

    satisfaire:accomplir,observer,respecter,tenir

    soutenir:continuer,tenir

    supporter:soutenir,tenir

    suivre:accomplir,continuer,observer,respecter,se conformer,soutenir,tenir

    se conformer:observer,respecter,tenir

    tenir:accomplir,continuer,observer,respecter,se conformer,soutenir
    lami20j@debian:~/bin/my_deb_perl$
    lami20j
    --
    lami20j

  7. #27
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,
    Citation Envoyé par lami20j
    my (%tmp_vs,%ved_syn);
    $tmp_vs{$vedette} = $synons;
    $ved_syn{$vedette} = $tmp_vs{$vedette};
    Désolé j'ai oublié. Le hash %tmp_vs ne sers à rien.
    Au lieu de écritet au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $tmp_vs{$vedette} = $synons; 
    $ved_syn{$vedette} = $tmp_vs{$vedette};
    écrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ved_syn{$vedette}  = $synons;
    lami20j
    --
    lami20j

  8. #28
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    merci pour ton aide
    Par contre j'aurais peut-etre d'autres questions à poser plutard, donc je ne ferme pas tout de suite le sujet, si ça ne dérange personne.

    @ plus

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    bonjour à tous il y a encore des petites chose qui m'échappe en perl
    Voila mon problème

    je parcours un fichier qui est composé pour chaque ligne d'un mot en français puis d'un mot en allemand. Je souhaite ajouter à cette ligne les synonyme francais correspondant au mot français et les synonymes allemands coorespondant au mot français


    je fais donc la manipulation suivante
    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
     
    foreach my $ved (@ved_direct_fr_all){
        print("début du foreach $ved\n");
        if(grep { /$ved/ } @vedette_fr){
        print("entre dans boucle if 1\n");
        push(@res , @{$ved_syn_fr{$ved}});
        push(@res3,@res);
        @res=();
        }
        else{
        print("entre dans le else    $ved \n");
        if(grep { /$ved/ } @vedette_all){
            print("entre dans boucle if 2\n");
            push(@res2,@{$ved_syn_all{$ved}});
            push(@res3,@res2);
            @res2=();
        }
        print("fin boucle else \n");
        }
        print("fin du foreach\n");
    }
    Le probleme est le suivant : il regarde le premier mot il voit qu'il appartient @vedette_fr (qui est la lise des cléfs de ma table de hachage), puis passe au second mot qui est bien le mot allemand par contre il n'entre pas dans le seconf if.
    Il parcours tous les mots français et à la fin il parcours (enfin) tous les mots allemands et la entre bien dans le second if

    Pouvait vous me dire d'où provient ce problème?

    fessebleu

  10. #30
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par fessebleu
    foreach my $ved (@ved_direct_fr_all){
    print("début du foreach $ved\n");
    if(grep { /$ved/ } @vedette_fr){
    print("entre dans boucle if 1\n");
    push(@res , @{$ved_syn_fr{$ved}});
    push(@res3,@res);
    @res=();
    }
    else{
    print("entre dans le else $ved \n");
    if(grep { /$ved/ } @vedette_all){
    print("entre dans boucle if 2\n");
    push(@res2,@{$ved_syn_all{$ved}});
    push(@res3,@res2);
    @res2=();
    }
    print("fin boucle else \n");
    }
    print("fin du foreach\n");
    }
    fessebleu
    Tout d'abord je te conseil de lire un peu la documentation, et si tu l'as déjà fait je te conseils de la relire.

    Je ne comprends pas pour quoi tu veux afficher quelque chose pour chaque élément du tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     foreach my $ved (@ved_direct_fr_all){
        print("début du foreach $ved\n");
    Pourquoi tu fait quelque chose de genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (condition1) {
       instructions....
    }
    else {
       if (condition2){
          instructions....
        }
    }
    quand tu peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (condition1){
       instructions...
    elsif (condition2){
        instructions...
    }
    ?
    ou même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (conditon1){
       instructions...
    }
    else {
        instructions...
    }
    Dans ton cas si le 1er if est satisfait tu n'entrera jamais dans le 2ème if, et ça parce que ton 2ème if se trouve dans else {...}

    Ca sera mieux de montre ce que tu as en entrée et ce que tu veux en sortie, pour mieux comprendre ce que tu veux obtenir.
    Je n'envisage pas d'écrire le code à ta place, en revanche sachant ce que tu veux on pourra construire ton script et dans le même temps on pourra apprendre de choses.

    J'a peur que demain tu vas ajouter des mot anglais

    lami20j
    --
    lami20j

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Ne t'inquiete pas je ne souhaite pas que l'on écrive le code car aussi non je n'apprendrai rien .

    si je résume:
    j'ai un fichier de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    accomplir:durchfhren
    arr�er:halten
    conserver:halten
    continuer:halten
    d�endre:halten
    ex�uter:durchfhren
    faire:durchfhren
    garder:halten
    Ce fichier représente les traductions directe d'un mot en français ers l'allemand

    A partir de ce fichier, je dois obtenir un dictionnaire français allemand .de la forme suivante
    vedette_fr1,vedette_all1:listesynonyme_vedette_fr1,listesynonyme_vedette_all1
    vedette_fr2,vedette_all2:listesynonyme_vedette_fr2,listesynonyme_vedette_all2
    ainsi de suite

    J'ai donc splité mon fichier de facon à faire disparaitre les deux pointset je l'ai mis dans une liste

    Je parcours ma liste, si m'on premier élément appartient est une vedette de mon dictionnaire français , si oui j'ajoute dans une liste les synonymes correspondant, sinon je test si la vedette appartient à mon dictionnaire allemand si oui j'ajoute les synonyme corespondant à la vedette dans une liste

    Voilà l'algo que je veux mettre en place, pour l'instant je n'ai pas traité la mise en forme de mes listes car je ne comprend pas pourquoi il traite d'abord tous les mots en français et qu'il ne traite pas les mots allemand

    EDIT : les print me servent à comprendre ce que fait le programme

Discussions similaires

  1. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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