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 :

[Débutant] Extraction de données dans un fichier texte + manipulation d'expressions régulières


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur Etude & Développement
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etude & Développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut [Débutant] Extraction de données dans un fichier texte + manipulation d'expressions régulières
    Bonjour à tous.
    Dans le cadre de mes travaux, je suis amené à manipuler des fichiers de données relativement imposants. Afin d'extraire uniquement les paramètres qui me sont nécessaires, j'ai décidé de faire appel à mes faibles connaissances en Perl. Le résultat est laborieux et le tri peu satisfaisant pour le moment. C'est pourquoi je suis venu solliciter un peu d'aide sur ce forum.

    Le fichier texte a l'allure suivante. J'ai mis en gras les parties à extraire.

    Code txt : 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
    ----------------------------------------------------------------------------------------------------------------------------------
            0 -2.2100E+04  4.0000E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
      0.00000 -2.2174E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
          1.5  2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.9454E+00
     ----------------------------------------------------------------------------------------------------------------------------------
    ----------------------------------------------------------------------------------------------------------------------------------
            1 -2.2094E+04  4.0221E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
      0.00100 -2.2164E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
          1.5  2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.7415E+00
    
      rolling -2.2094E+04  4.0221E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
     averages -2.2164E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
               2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.7415E+00
     ----------------------------------------------------------------------------------------------------------------------------------
           10 -2.2098E+04  4.0000E+03 -2.3131E+04 -8.6685E+02 -2.2264E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
      0.01000 -2.2030E+04  0.0000E+00  1.8604E+03 -2.0401E+04  2.2262E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
          3.1  2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00  3.6524E+00
    
      rolling -2.2096E+04  4.0908E+03 -2.3152E+04 -9.0886E+02 -2.2243E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
     averages -2.2150E+04  0.0000E+00  2.2748E+03 -1.9966E+04  2.2240E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
               2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -2.9064E+00
     ----------------------------------------------------------------------------------------------------------------------------------
           20 -2.2110E+04  4.0000E+03 -2.3142E+04 -9.1624E+02 -2.2226E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
      0.02000 -2.2230E+04  0.0000E+00  2.4243E+03 -1.9800E+04  2.2224E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
          4.8  2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -6.4119E+00

    Comme vous pouvez le constater, la distinction entre les différentes lignes n'est pas évidente à réaliser à partir d'une expression régulière.

    Voilà où en est mon code, certes très primaire, actuellement.

    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
    #!/usr/bin/perl
    if (open FD, "OUTPUT"){
    	@lignes=<FD>;
    	@press=();
    	@indice=();
    	$i=0;
    	foreach $ligne(@lignes){
    		if ($ligne=~/^\W\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)/){
    			if ($ligne!~/\brolling\b/){
    			@press[$i]=$10;
    			@indice[$i]=$2;
    			$i++;}}
    		}
    	close FD;}
    else {print "Le fichier OUTPUT n'a pas pu être ouvert.";}
     
    if (open FS1, ">press.dat"){
    	for ($i=0;$i<=$#press;$i++){
    		print FS1 "$indice[$i] \t $press[$i] \n";}		
    	close FS1;}
     
    if (open FO, "press.dat"){
    	@parcours=<FO>;
    	@pression=();
    	@volume=();
    	$j=0;
    	foreach $parcour(@parcours){
    		if ($parcour=~/^(.+)\s(.+)/){
    			if ($parcour!=/\beng_tet\b/){
    				@volume[$j]=$1;
    				@pression[$j]=$2;
    				print "V = $volume[$j] \t P = $pression[$j] \n";
    				$j++;}
    			}
    		}
    	close FO;}
    else {print "Le fichier pression.dat n'a pas pu être ouvert.";}
     
    if (open FS2, ">pression.dat"){
    	for ($i=0;$i<=$#pression;$i++){
    		print FS2 "$volume[$i] \t $pression[$i] \n";}		
    	close FS2;}
    Ce code, qui n'extrait pas le tout premier paramètre de chaque pallier (celui directement à droite de l'incrément) donne en sortie finale :

    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -2.2100E+04  	 	 0.0000E+00  
    -2.2174E+04  	 	 0.0000E+00  
    2.9532E+04  	 	 -3.9454E+00  
    -2.2094E+04  	 	 0.0000E+00  
    -2.2164E+04  	 	 0.0000E+00  
    2.9532E+04  	 	 -3.7415E+00  
    2.9532E+04  	 	 -3.7415E+00  
    -2.2098E+04  	 	 0.0000E+00  
    -2.2030E+04  	 	 0.0000E+00  
    2.9532E+04  	 	 3.6524E+00  
    2.9532E+04  	 	 -2.9064E+00  
    -2.2110E+04  	 	 0.0000E+00  
    -2.2230E+04  	 	 0.0000E+00  
    2.9532E+04  	 	 -6.4119E+00

    Comme vous pouvez le voir, mon code est très brouillon et le résultat loin d'être optimal. J'aimerais savoir si vous avez des idées pour extraire ces quelques paramètres d'une manière plus propre (et sans données parasites inutiles^^). Je pense qu'il suffit de retravailler les différentes expressions régulières mais comme cela n'a jamais été trop mon fort, je coince un peu. Si quelqu'un peut m'aider à me sortir de ce mauvais pas, je lui en serais reconnaissant. Merci d'avance.

    PS : J'ignore si le topic est bien placé. Si ce n'est pas le cas, je m'en excuse.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonjour,

    Afin de t'aider à concevoir un code propre, il faut déjà un algorithme propre. Pour parler français, il faudrait que tu nous précise exactement ce que tu veux extraire. En clair, expliquer (avec des phrases simple) les valeurs que tu souhaites extraire. Qu'est ce qui te permet d'extraire une ligne par rapport à une autre, une colonne par rapport à une autre.

    Une fois le problème posé, il sera plus simple de coder.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur Etude & Développement
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etude & Développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Très bien, je vais essayer d'expliciter tout ça.
    Le fichier à analyser présente le motif suivant qui est répété un certain de nombre de fois. Dans l'exemple, nous sommes au premier pas (ou au deuxième si on compte le pas 0 qui est un cas particulier). Le pas suivant est le pas 10, puis 20, 30,... toujours par pas de 10 ensuite. Chaque motif comporte 6 lignes pour 10 colonnes. Les 3 dernières lignes (à partir de 'rolling') ne nous intéressent pas. Les parties à extraire sont colorées dans le texte. Il s'agit du deuxième élément de la première ligne, du deuxième élément de la troisème ligne et du dixième élément de la troisième ligne. Pour revenir au pas initial (pas 0), on peut remarquer qu'il ne comporte que les 3 premières lignes, donc celles comportant les informations à extraire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            1 -2.2094E+04  4.0221E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
      0.00100 -2.2164E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
          1.5  2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.7415E+00
    
      rolling -2.2094E+04  4.0221E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
     averages -2.2164E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
               2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.7415E+00
    En amont, comme en aval de ces données, se trouvent également d'autres lignes textes inutiles à l'exploitation. Aussi, pour me concentrer sur la partie qui m'intéresse, j'ai essayé d'extraire pour commencer toutes les lignes comportant 10 chaînes de caractère séparées par un élément \s (représentant un caractère \t ou \n,...). Ce traitement a l'air de plus ou moins fonctionner. Le tri entre les 6 lignes présentées est plus délicat en revanche.

    Algorithme primaire :
    - Ouverture du fichier de données.
    - Lecture du fichier, on parcours chaque ligne une par une.
    - Pour chaque ligne, on applique une expression régulière. Si la ligne possède le format précisé plus haut, alors on extrait, par exemple, $10, le dixième élément de la ligne.
    - On sauvegarde les données extraites dans un tableau, ces dernières sont ensuite copiées dans un autre fichier.

    J'ai plus ou moins trouvé comment récupérer uniquement le terme en rouge dans le texte. Pour cela, j'applique une expression régulière qui ne retient que les lignes commençant par une tabulation et suivies d'un ou plusieurs caractères numériques (\d) (l'incrément). Cette partie fait l'objet d'un autre programme. Mon principal problème réside dans le fait que je n'arrive pas à récupérer exxclusivement la troisième ligne du premier segment (celle comportant les termes en vert et en bleu). Pour l'instant, mon expression régulière retient les 4 lignes suivantes (en gras) et je ne vois pas comment les différencier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            1 -2.2094E+04  4.0221E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
      0.00100 -2.2164E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
          1.5  2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.7415E+00
    
      rolling -2.2094E+04  4.0221E+03 -2.3133E+04 -9.0715E+02 -2.2225E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
     averages -2.2164E+04  0.0000E+00  2.2861E+03 -1.9937E+04  2.2223E+04  0.0000E+00  0.0000E+00  0.0000E+00  0.0000E+00
               2.9532E+04  0.0000E+00  0.0000E+00  0.0000E+00  9.0000E+01  9.0000E+01  9.0000E+01  0.0000E+00 -3.7415E+00
    C'est donc principalement sur ce point que je manque d'inspiration. Voilà. Si cela manque encore de précisions, n'hésitez pas à me le faire remarquer.

    Bonne journée !

  4. #4
    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
    Citation Envoyé par Profix Voir le message
    Aussi, pour me concentrer sur la partie qui m'intéresse, j'ai essayé d'extraire pour commencer toutes les lignes comportant 10 chaînes de caractère séparées par un élément \s (représentant un caractère \t ou \n,...). Ce traitement a l'air de plus ou moins fonctionner. Le tri entre les 6 lignes présentées est plus délicat en revanche.
    En considérant que @ligne contient l'ensemble du tableau, extraire les lignes qui comportent 10 colonnes peut se faire simplement ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @pas = grep { split(/\s+/) == 10 } @ligne;
    Comme ta première colonne semble pouvoir contenir des espaces, en les éliminant, on transforme la 6 ligne d'un pas en ligne à 9 colonne, ce qui permet de l'éliminer naturellement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @pas = grep { my $ligne = $_; $ligne =~ s/^\s*//; split(/\s+/, $ligne) == 10 } @ligne;
    On peut également tout de suite en profiter pour éliminer les lignes dont la première colonne contient des lettres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @pas = grep { (my $ligne = $_) =~ /s^[\sa-zA-Z]*//; split(/\s+/, $ligne) == 10 } @ligne;
    Pour extraire les données on peut alors utiliser :
    (split /\s+/, $pas[0])[1] (élément rouge), et (split /\s+/, $pas[2])[1, 9] (éléments bleu et vert).

    Pour faciliter cette extraction, on peut aussi transformer le résultat précédent en une liste de tableau de 10 colonnes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @pas = map { split /\s+/ } @pas;
    Pour récupérer les éléments souhaités, il suffit alors d'écrire :
    $pas[0]->[1] (élément rouge), $pas[2]->[1] (élément bleu) et $pas[2]->[9] (élément vert).

    En abusant, on pourrait écrire cela sur une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @pas = map { split /\s+/ } 
      grep { (my $ligne = $_) =~ /s^[\sa-zA-Z]*//; split(/\s+/, $ligne) == 10 } @ligne;
    ou pour économiser un split:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @pas = map { (my $ligne = $_) =~ /s^[\sa-zA-Z]*//;
      my @un_pas = split(/\s+/, $ligne);
      @un_pas == 10 ? [ @un_pas ] : ();
    } @ligne;
    Si tu as des questions, n'hésite pas.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur Etude & Développement
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etude & Développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour Philou !

    Je te remercie de t'être penché ainsi sur mon cas. Je suis arrivé, au cours de la matinée, à extraire les parties que je souhaitais de mon fichier (en multipliant les conditions if et les expressions régulières). Mais ma solution ressemble plus à du bricologe qu'autre chose. Aussi, il me semble plus qu'intéressant de recommencer en mettant en application tes conseils, de sorte à obtenir un code plus propre mais surtout fonctionnel dans le cas le plus général possible. Je vais donc m'y atteler de ce pas^^. Merci encore pour ton aide.

  6. #6
    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
    N'hésite pas à reposter si tu as des questions.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur Etude & Développement
    Inscrit en
    Mars 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Etude & Développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour !

    Finalement, je n'ai pas eu l'occasion, étant contraint de passer à autre chose, de mettre en application la solution de Philou.

    Malgré tout, je tiens à le remercier pour son aide mais aussi à vous proposer la solution, certes moins noble, que j'ai utilisé.

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    #!/usr/bin/perl
    if (open FD1, "OUTPUT"){
    	@lignes=<FD1>;
    	@energy=();
    	@step=();
    	@suppr=();
    	$i=0;
    	foreach $ligne(@lignes){
    		if ($ligne=~/^\s+(\d+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)/){
    			if ($ligne!~/\bbuck\b/){
    				#print "$1 \t $2 \n";
    				@step[$i]=$1;
    				@energy[$i]=$2;
    				@suppr[$i]=$10;
    				$i++;}
    			}
    		}
    	close FD1;}
    else {print "Le fichier OUTPUT n'a pas pu être ouvert.";}
    if (open FI, ">inter1.dat"){
    	for ($i=0;$i<=$#step;$i++){
    		if (@suppr[$i]=~/^[0]\W[0]\d+/){
    			print FI "$step[$i] \t $energy[$i] \n";}
    		}
    	close FI;} 
    if (open FD2, "OUTPUT"){
    	@lignes=<FD2>;
    	@pressure=();
    	@id=();
    	$j=0;
    	foreach $ligne(@lignes){
    		if ($ligne=~/^\W\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)/){
    			if ($ligne!~/\brolling\b/){
    				if ($ligne!~/^\s+(\d+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)/){
    					if ($ligne!~/^\s\s\s\s\s\s\s\s\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)+\s+(.+)/){
    						@pressure[$j]=$10;
    						@id[$j]=$2;
    						$j++;}
    					}
    				}
    			}
    		}
    	close FD2;}
    else {print "Le fichier OUTPUT n'a pas pu être ouvert.";}
    if (open FJ, ">inter2.dat"){
    	for ($i=0;$i<=$#pressure;$i++){
    		print FJ "$id[$i] \t $pressure[$i] \n";}		
    	close FJ;}
    if (open FO, "inter2.dat"){
    	@parcours=<FO>;
    	@pression=();
    	@volume=();
    	$k=0;
    	foreach $parcour(@parcours){
    		if ($parcour=~/^(.+)\s(.+)/){
    			if ($parcour!=/\beng_tet\b/){
    				@volume[$k]=$1;
    				@pression[$k]=$2;
    				if (@pression[$k]!~/^[0]\W[0]\d+/){
    					if (@volume[$k]!~/^\s+/){
    						#print "V = $volume[$k] \t P = $pression[$k] \n";
    						$k++;}
    					}
    				}
    			}
    		}
    	close FO;}
    else {print "Le fichier inter2.dat n'a pas pu être ouvert.";}
    if (open FE, "inter1.dat"){
    	@lecture=<FE>;
    	@pas=();
    	@energie=();
    	$l=0;
    	foreach $read(@lecture){
    		if ($read=~/^(\d+)\s+(.+)/){
    			@pas[$l]=$1;
    			@energie[$l]=$2;
    			$l++;}
    		}
    	close FE;}
    else {print "Le fichier inter1.dat n'a pas pu être ouvert.";}
    if (open FS, ">data.out"){
    	for ($i=0;$i<=$#pas;$i++){
    		print FS "$pas[$i] \t $energie[$i] \t $volume[$i] \t $pression[$i] \n";}	
    	close FS;}
    Le code est fonctionnel et renvoie en sortie un fichier texte comportant les données demandées. Je reconnais volontiers qu'il manque sincèrement de classe et qu'il peut sans doute être aisément simplifié (notamment en se débarrassant des fichiers intermédiaires ou en parcourant le fichier source une seule fois). Cependant, ce programme reste un bon exemple d'utilisation des expressions régulières pour les éventuels intéressés.

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

Discussions similaires

  1. Extraction de données dans un fichier texte
    Par SpyGer dans le forum MATLAB
    Réponses: 4
    Dernier message: 06/02/2011, 09h18
  2. Extraction des données dans un fichier texte brut
    Par Patrice.peace dans le forum Langage
    Réponses: 10
    Dernier message: 16/03/2010, 09h40
  3. Réponses: 4
    Dernier message: 05/02/2008, 11h08
  4. Extraction de données dans un fichier texte en VB6 !
    Par rockroa dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 21/06/2006, 16h00
  5. Réponses: 2
    Dernier message: 16/01/2006, 19h34

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