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 :

table, liste, hash et tout et tout.. pour débutant


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut table, liste, hash et tout et tout.. pour débutant
    Bonjour,
    suite à un problème technique ma contribution a été supprimée donc tout est perdu et désolé pour les personnes ayant contribuées aux réponses surtout Jasmine80.
    biensur j'ai pas copié les réponses et les explications de Jasmine80.
    je réexplique donc si vous voulez bien de nouveau m'aider.

    je dois à partir de 2 fichiers (pour le moment ou plus) sortir un fichier txt avec une synthese. ces fichiers contiennent des adresses mails , 1 par ligne avec un chiffre, par exemple dans le fichier test1.txt
    toto@toto.com 5
    tutu@tutu.com 2
    titi@titi.com 1
    dans le fichier test2.txt
    toto@toto.com 5
    tutu@tutu.com 3
    l'objectif est d'avoir un fichier résultat avec:
    toto@toto.com 10
    tutu@tutu.com 5
    titi@titi.com 1
    hors mon script actuelle ne me donne pas ce résultat et c'est là que j'ai difficulté car encore très débutant, j'obtient dans mon fichier résultat
    toto@toto.com 5
    toto@toto.com 5
    tutu@tutu.com 2
    tutu@tutu.com 3
    titi@titi.com 1
    mais pas la synthese
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    #!c:/perl/perl.exe 
    package test;
    #use warnings;
     
    my %hashTemp;
    my $fic;
    my $rep="d:/test/";
    my $res="testresult.txt";
     
    getFiles($rep,\@fichiers);
     
    open F_ECRIRE,">$rep/$res"  or die "E/S : $!\n";
     
    foreach $fic(@fichiers){
      open F_LIRE,"$fic" or warn "E/S : $!\n";
       my $ligne;   
     
       while($ligne = <F_LIRE>){     
     
                if (($ligne =~ /f\=([^\s]*)/ig)){
                      my @values = split (" ",$ligne);
                      my $url = $values[0]; 
                      my $result = $values[1];
                      my $tmpValue = $hashTemp{"$url $result"};
     
     
                      $hashTemp{"$url $result"} = $tmpValue;                  
     
                }          
          }
        }
     
    print F_ECRIRE "$_ $hashTemp{$_}\n" foreach (sort keys %hashTemp);
     
    1;
     
    sub getFiles{
      my $repert = shift(@_);
      local *tableau = shift(@_);
      my $fichier;
      my @sousrepertoires;
     
      if (-d $repert){
        opendir (REP,$repert)  or die "E/S : $!\n";
     
        while (defined ($fichier = readdir(REP))){
            if ((!($fichier=~m/^\./))&&(-d "$repert/$fichier")){
                push @sousrepertoires,"$repert/$fichier"; 
     
            }else{
              if ((!($fichier=~m/^\./))&&($fichier=~m/^test/)){
               push @tableau,"$repert/$fichier"; 
               }  
            }
        }
        foreach $fichier(@sousrepertoires){
          getFiles($fichier,\@tableau);    
        }
     }  
    }
    je ne sais pas comment m'en sortir, le sub recherche dans tous les répertoires et sous répertoires les fichiers qui commencent par test.
    comment modifier mon script pour arriver à mon fichier final ?
    merci de votre aide

  2. #2
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Voici un code qui à partir d'une liste de fichiers contenant des adresses et des nombres associés renvoie la somme de ces nombres par adresse.

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    =h
    ENTREE
    -------
    Fichier toto1.txt
    tutu@tutu.com 2
    titi@titi.com 1
     
    Fichier toto2.txt
    toto@toto.com 5
    tutu@tutu.com 3
    =cut
     
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
    # en entrée, la liste des fichiers
    my @a_files = glob("P:/Perl/scripts2/Files/toto*.txt");
     
    # tableau : clé adresse mail   valeur : compte total
    my %h_count;
     
    # traitement fichier par fichier
    foreach my $file (@a_files){
     
        open (FILE, $file) or die "Impossible d'ouvrir le fichier $file";
        # @a_mail_list contient les lignes
        my @a_mail_list = <FILE>;
        close (FILE);
     
     
        foreach my $mail (@a_mail_list){
            # expression régulière
            # $1 contient l'adresse mail
            # $2 contient le nombre associé
            if ($mail =~ /(\w+@\w+\.\w+)\s+(\d+)/){
                $h_count{$1} += $2;
            }
        }
    }
     
    foreach my $mail (keys %h_count){
        print "$mail $h_count{$mail}\n";
    }
     
    =h
    SORTIE
    --------
    toto@toto.com 10
    titi@titi.com 1
    tutu@tutu.com 5

  3. #3
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut suite
    bonjour,
    merci pour ta réponse
    étant encore débutant il y a chose que je ne comprends pas
    pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # en entrée, la liste des fichiers
    my @a_files = glob("P:/Perl/scripts2/Files/toto*.txt");
    je veux m'affranchir de mettre des chemins et noms en dur dans mon script
    c'est pour cela qu'est fait le sub getfile
    A cette étape de mon script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (($ligne =~ /f\=([^\s]*)/ig)){
                      my @values = split (" ",$ligne);
                      my $url = $values[0]; 
                      my $result = $values[1];
                      my $tmpValue = $hashTemp{"$url $result"};
     
     
                      $hashTemp{"$url $result"} = $tmpValue;
    tout est stocké dans mon hash , d'accord ?
    comment faire pour relire mon hash et faire le cumul ?
    c'est la que je ne comprend pas.
    merci beaucoup

  4. #4
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @a_files = glob("P:/Perl/scripts2/Files/toto*.txt");
    Pour tester mon script, j'avais besoin de récupérer la liste de mes fichiers. Glob est une fonction permettant cela.

    ----------------------------------------------------------------------------------

    my @values = split (" ",$ligne);
    my $url = $values[0];
    my $result = $values[1];
    my $tmpValue = $hashTemp{"$url $result"};


    $hashTemp{"$url $result"} = $tmpValue;
    A quoi cela te sert-il de spliter $url et $result si ensuite tu les relies dans ta clé?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                      my $tmpValue = $hashTemp{"$url $result"};                  
                      $hashTemp{"$url $result"} = $tmpValue;
    Ca c'est vraiment étrange.


    ----------------------------------------------------------------------------------



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @values = split (" ",$ligne);
                      my $url = $values[0]; 
                      my $result = $values[1];
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if ($mail =~ /(\w+@\w+\.\w+)\s+(\d+)/){
                my $url = $1;
                my $result = $2;
                $h_count{$1} += $2;
            }
    Ces parties de code font la même chose. La tienne sépare en fonction de l'espace et la mienne également.
    (\w+@\w+\.\w+)\s+(\d+)
    Va voir comment fonctionnent les expressions régulières sur la FAQ si tu veux comprendre cela.

    ----------------------------------------------------------------------------------

    Pour répondre à ta question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (($ligne =~ /f\=([^\s]*)/ig)){
                      my @values = split (" ",$ligne);
                      my $url = $values[0]; 
                      my $result = $values[1];
                      $hashTemp{$url} +=  $result;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hashTemp{$url} +=  $result;
    Tu ajoutes la valeur $result à la valeur de ton tableau correspondant à la clé $url.


    Est-ce plus clair ainsi?

  5. #5
    Membre averti
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Par défaut problème
    merci
    A quoi cela te sert-il de spliter $url et $result si ensuite tu les relies dans ta clé?
    je pense que c'est bien une erreur de débutant !

    j'ai modifié mon script ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    foreach $fic(@fichiers){
      open F_LIRE,"$fic" or warn "E/S : $!\n";
       my $ligne;      
       while($ligne = <F_LIRE>){ 
    if ($ligne =~ /(\w+@\w+\.\w+)\s+(\d+)/){
                my $url = $1;
                my $result = $2;
                $h_count{$1} += $2;
            }     
          }
        }
     
    print F_ECRIRE "$_ $h_count{$_}\n" foreach (sort keys %h_count);
    j'ai un souci mon fichier résultat est vide et pas d'erreur script
    merci

  6. #6
    Membre éprouvé
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Par défaut
    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
    if ($ligne =~ /(\w+@\w+\.\w+)\s+(\d+)/){
                #  inutile (sauf pour comprendre ce que tu récupères)
                #  my $url = $1;
                #  my $result = $2;
                $h_count{$1} += $2;
            }     
            else {
                print "ERREUR POUR LA LIGNE $ligne";
            }
     
    ...
     
    foreach (sort keys %h_count){
        print F_ECRIRE "$_ $h_count{$_}\n";
    }

    Vérifie que tu rentres bien dans ton fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ($ligne = <FICH>){
    print $ligne;
    ...
    }
    Ensuite, vérifie que tu rentres bien dans l'expression régulière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            else {
                print "ERREUR POUR LA LIGNE $ligne";
            }

Discussions similaires

  1. [MySQL] mettre un code sur toutes les pages pour dire de s'inscrire
    Par will_smith dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/07/2008, 12h15
  2. Réponses: 16
    Dernier message: 05/08/2006, 11h07
  3. une toute petits aide pour finaliser tout sa
    Par yoan_111 dans le forum ASP
    Réponses: 6
    Dernier message: 16/12/2005, 16h04
  4. Requete SELECT : prendre toutes les valeurs pour 1 champ
    Par fab22montpellier dans le forum Requêtes
    Réponses: 1
    Dernier message: 02/09/2005, 09h12

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