Rechercher : dans
Par :

Perl: lecture d'un repertoire et de fichiers

Dernière réponse le 12 mai 2009 à 22:00:38 tonguim, le 11 mai 2009 à 21:59:20 
 Signaler ce message aux modérateurs

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:

Unmatched ) in regex; marked by <-- HERE in m/) <-- HERE \S/ at lectureFichierPerl.pl line 18


#!/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;
.

Merci.
Configuration: Linux Fedora
Firefox 2.0.0.10


Tous les fichiers ont le même contenu suivant:
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))] [] []).

Meilleures réponses pour « Perl: lecture d'un repertoire et de fichiers » dans :
Comment lire un fichier ligne par ligne Voir Comment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier...
Lire un fichier en .rbs VoirOn peut rencontrer parfois des fichiers en .rbs, issus d'un enregistrement ou un autre. La solution la plus simple pour lire ces fichiers est tout bêtement de remplacer l'extension .rbs par .mp3 Si vous ne voyez pas l'extension du fichier, faites...
Perl - Les fichiers VoirLa notion de filehandle On appelle filehandle (traduisez descripteur de fichier), dans un programme Perl, le nom permettant de manipuler une connexion d'entrée-sortie (les entrées-sorties standards vues précédemment sont connues par les filehandles...
Fichier 7Z VoirFormat 7Z Un fichier 7Z est un fichier compressé. Comment lire un fichier 7z ? Pour décompresser un fichier 7Z, il suffit d'utiliser le logiciel suivant : 7zip

1

 tonguim, le 12 mai 2009 à 22:00:38

Bonjour,

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 [QUOTE]while ((($debut, $fin) = $result =~ /debut\s+([0-9]+).+?fin\s+([0-9]+)/g) and $i < 3)/QUOTE

#!/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);

Répondre à tonguim