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.
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 : 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;}
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.
Partager