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 :

Lecture d'un repertoire, et lecture de fichiers


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 34
    Points
    34
    Par défaut Lecture d'un repertoire, et lecture de fichiers
    Bonjour,

    je voudrais écrire un programmer, qui lit plusieurs fichiers, terminés par l'extension ".txt", et stockés dans le même repertoire. Le programme doit lire chaque fichier, et chaque ligne et chercher la première valeur trouvée après le mot debut, et la première valeur trouvée après le mot fin et faire leur différence. Idem pour la ligne suivante, et pour les autres fichiers.
    A la compilation, j'obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unmatched ) in regex; marked by <-- HERE in m/) <-- HERE \S/ at lectureFichierPerl.pl line 18
    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
    #!/usr/bin/perl -w
    #use strict;
    use warnings;
     
    use CGI::Carp qw(fatalsToBrowser);
     
    my $dir = './Chemin/Fichier/';
     
    # read all entries in the directory:
    opendir DIR, $dir or die "Cannot open $dir $!";
    my @listeFichiers = grep /\.txt$/, readdir DIR;
    foreach $file (@listeFichiers) 
    {
    	open FILE, $file or die $!;
      print $file . "\n";
    	while (my $line = <FILE>) # lire chaque ligne et chercher la première valeur trouvée après le mot debut, et la première valeur trouvée après le mot fin
    	{
    		$line1  =~ m{debut}/(\s*)\S*\s*\S*\s*\S*\s*\S*\s*(\S*/);
     
    		$X1=$S1; $X4=$S4;
    		$lenght1= $X1-$X2; # Calculation of the lenght of first segment
     
    		$line1  =~ m{fin}/(\s*)\S*\s*\S*\s*\S*\s*\S*\s*(\S*/);
    		$X1=$S11; $X4=$S14;
    		$lenght2= $X1-$X2; # Calcul de la longueur du premier segment
     
    	}
    		push(@elements1, $lenght1); #Push la longueur dans un tableau pour calculer la moyenne de la longueur du segment n°1
    		push(@elements2, $lenght2); #Push la longueur dans un tableau pour calculer la moyenne de la longueur du segment n°2
    }
     
    foreach (@elements1)
    {
    	    $sum1 += $_;
    }
     
    foreach (@elements2)
    {
    	    $sum2 += $_;
    }
     
    $moyLongSeg1=$sum1/2;
    $moyLongSeg2=$sum2/2;
    closedir DIR;
    Tous les fichiers ont le même contenu suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champs1 (champs6 donnee_o donnee_f) [(champs2 [] (champs3 _YOJNJeyyyyyyB (champs4 donnee_x)) (debut 144825 25345) (fin 244102 40647)), (champs2 [] (champs3 _FuGNJeyyyyyyB (champs4 donnee_z)) (debut 796443 190570) (fin 145247 42663))] [] []).

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $line1  =~ m{debut}/(\s*)\S*\s*\S*\s*\S*\s*\S*\s*(\S*/);
    C'est quoi ce truc ?
    Révise la syntaxe des regexps, ceci est parfaitement incorrect, comme indiqué dans le message d'erreur.

    --
    Jedaï

  3. #3
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Je pense que ton problème vient du "/" situé dans la prenthèse à la fin de ton expression. Enfin ça c'est pour le message d'erreur je dirais.

    Ecrit (\S*)/ plutôt que (\S*/)

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    je n'ai plus d'erreurs dans le code, mais rien ne s'affiche à l'écran
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use diagnostics;
    use CGI qw/:standard/; 
    use CGI::Carp 'fatalsToBrowser';
     
    our $dir = '/chemin/Fichiers/';
    our $meanOfLenghts1;
    our $meanOfLenghts2;
    our $mimetype;
    our $numberOfFilesListed;
    our $sum2;
    our $sum1;
    our $file;
    our $i;
    our @elements;
    our @elements1;
    our @elements2;
    our $fh,
    our @length;
    #our $length;
    our @listeFichiersMem;
    our $debut;
    our $fin;
    our $line;
    our $result;
    our $value;
     
    my $cgi = CGI -> new();
     
    # read all entries in the directory:
    opendir DIR, $dir or die "Cannot open $dir $!";
    @listeFichiersMem = grep /\.txt$/, readdir DIR;
    closedir DIR;
    #printf $cgi -> header("Content-type: $mimetype; charset=utf-8; Content-Disposition: attachment;");
     
    foreach $file (@listeFichiersMem) 
    {
    		printf "Hallo test";
        $i = 1;
    		$numberOfFilesListed++;
    		open $fh, "<", $file or die $!;
    	  print "$file" . "\n";
     
    		while ($line = $fh) #read each line from FILE.
        {
              chomp ($line);
              while ((($debut, $fin) = $result =~ /debut\s+([0-9]+).+?fin\s+([0-9]+)/g) and $i < 3)
              {
                            $length[$i] = $fin - $debut; # Calculation of the lenght of the first segment, then the lenght of the second segment
                            #push(@elements[$i], $length[$i]); #Push the 2 computed lenghts into a table to compute the mean of lenght for the 2 segments
                            $elements[$i] -> push($length[$i]);
                            $i++;
              }
        }
    		close $fh;
    }
     
    foreach $value (@elements1)
    {
            $sum1 += $value;
    				printf $sum1;
    }
     
    foreach $value (@elements2)
    {
            $sum2 += $value;
    }
     
    $meanOfLenghts1 = $sum1/$numberOfFilesListed;
    $meanOfLenghts2 = $sum2/$numberOfFilesListed;
     
    printf ("%d %d", $meanOfLenghts1, $meanOfLenghts2);

  5. #5
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Essaie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /debut\s+(\d+).+\s+fin\s+(\d+)/
    J'ai enlevé la recherche globale, je pense que tu ne recherche ce motif qu'une fois. ça marchera pas mieux mais c'est plus joli non ?

    Met un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "je suis dans la boucle et result vaut $result\n"
    dans ta boucle pour savoir si tu entres et ce que vaut result!

    Ne devrais tu pas enregistrer le contenu de ta ligne dans result à un moment ? tu cherches un motif dans result mais que vaut result ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 49
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Olivier.p Voir le message
    J'ai enlevé la recherche globale, je pense que tu ne recherche ce motif qu'une fois. ça marchera pas mieux mais c'est plus joli non ?
    Le programme lit plusieurs fichiers, terminés par l'extension ".txt", et stockés dans le même repertoire. Le programme doit lire chaque fichier, et:
    -premièrement, extraire la première valeur numérique trouvée après le premier mot debut, et la première valeur trouvée après le premier mot fin. La différence calculée donne la longueur du segment1. Au fur et à mesure que les fichiers sont lus, la somme des différence est effectuée pour les valeurs extraites après les premiers "debut" et "fin".
    -deuxièmement, le même procédé est repris pour le second "debut" et le second "fin"; la première valeur numérique trouvée après le scond mot debut, et la première valeur trouvée après le second mot fin sont extraites et leur différence est calculée également. De ce fait, la recherche globale me semble pertinente, puisque la recherche s'éffectue par paire et jusqu'à la fin du fichier.

    Met un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "je suis dans la boucle et result vaut $result\n"
    dans ta boucle pour savoir si tu entres et ce que vaut result!
    J'ai une erreur de division (division par 0); je pense que les variables @elements1 et @elements2 sont vides alors qu'elles sont censées obtenir leur contenu de la boucle
    while ((($debut, $fin) = $result =~ /debut\s+([0-9]+).+?fin\s+([0-9]+)/g) and $i < 3)

  7. #7
    Membre régulier Avatar de Olivier.p
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2009
    Messages : 89
    Points : 93
    Points
    93
    Par défaut
    Tu as donc les couples "début" et "fin" plusieurs fois dans la même ligne. Pourquoi tu n'enregistres pas simplement chaque ligne dans une variable que tu coupes avec un split (je te laisse choisir le délimiteur), ensuite tu cherches dans le tableau splitté la case qui contient "début", tu enregistre la valeur de la case suivante dans ta variable et tu fais pareil pour fin ?

    Cela suppose que tu cherches les valeurs après début et fin uniquement et pas ce qu'il ya entre deux couples.
    Exemple : Début 4 5 6 7 fin 8 9 10 sauvegardera 4 et 8 mais Début 4 5 6 7 Début 1 2 3 fin 8 9 10 sauvegardera 4 8 et 1 alors que tu n'as qu'un couple "Début" "Fin"

    Cela ne marche pas si tu as "début" ou "fin" en fin de ligne
    Exemple : Début 1 2 3 fin
    4 5 6 sauvegardera 1 et rien (je pense). Mais un p'tit if peut prendre ce cas en compte.

    Ton avis ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Est-ce que cet uniligne répond à ton besoin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'print +($2-$1),"\n" while /debut\s+(\d+).*?fin\s+(\d+)/gi' *.txt
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

Discussions similaires

  1. Réponses: 13
    Dernier message: 08/05/2007, 09h22
  2. Lecture de la premiere ligne d'un fichier
    Par ze veritable farf dans le forum C
    Réponses: 19
    Dernier message: 31/10/2006, 14h17
  3. Lecture et Stockage du contenu d'un fichier
    Par Raideman dans le forum C++
    Réponses: 9
    Dernier message: 22/08/2006, 07h12
  4. Lecture d'un nombre binaire dans un fichier ASCII
    Par semenzato dans le forum MFC
    Réponses: 1
    Dernier message: 13/04/2006, 22h41
  5. [C#] Lecture dans un endroit précis d'un fichier ...
    Par maitrebn dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/10/2004, 13h36

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