Récupérer plage de donnée

Résolu/Fermé
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016 - Modifié par Akre66 le 27/05/2014 à 16:12
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016 - 26 juin 2014 à 17:03
Bonjour à tous,
Alors un peu dans le meme genre que mon post précédent, que j'ai fini par réussir à améliorer, je me trouve devant un nouveau problème.

Alors ici dans un programme je cherche plusieurs informations.
Ces informations sont contenus dans un fichier assez lourd. Les données utiles se trouvent entre "DONNEES GENERALES" et "COMMENTAIRES LIBRES" (dans ce sens).
Je dois récupérer plusieurs informations.

Données que je recherche (infine partie du programme):



DONNEES GENERALES
-----------------


CENTRALE....................: XXX
TRANCHE.....................: X
CYCLE.......................: X
EPUISEMENT MOYEN............: AAAA Mwj/T
PUISSANCE NOMINALE..........: XXX
PUISSANCE RELATIVE..........: AAAA
BORE SOLUBLE................: AAAA
MODE DE PILOTAGE............: X
ENFONCEMENT DES GRAPPES (pas extraits)
G1 .......... AAA
G2 .......... AAAA
N1 .......... AAAA
N2 .......... AAAA
R .......... AAAA




COMMENTAIRES LIBRES
-------------------


Ce que je cherche c'est les données illustré par A ici.


Et j'ai pensé à faire ça (mais ça marche pas).
J'ai utilisé l'opérateur d'intervalles mais c'est la première fois...

if( -e "$home/etudes/$Site/$Tranche/$nom/occ1/listing"){
open(TRAITEMENT,"$home/etudes/$Site/$Tranche/$nom/occ1/listing"); ##On ouvre notre fichier

if(/GENERALES/ ... /COMMENTAIRES/)
{@donne=<TRAITEMENT>;
}
else{
print "Plage de donnee non trouvee pour $nom\n";
}}
close(TRAITEMENT);

$n=$#donne;
for($k=0;$k<$n;$k++){
if("@donne" =~/RELATIVE/){
@pivot=grep{$_=~/RELATIVE/} @donne;
@pivot=split(':',$pivot[0]);
$relative=$pivot[1];
}else{
print "Valeur de la Puissance relative non trouvee pour $nom\n";
}

if("@donne" =~/BORE/){
@pivot=grep{$_=~/BORE/} @donne;
@pivot=split(':',$pivot[0]);
$bore=$pivot[1];
}else{
print "Valeur du Bore soluble non trouvee pour $nom\n";
}

if("@donne" =~/EPUISSEMENT/){
@pivot=grep{$_=~/EPUISSEMENT/} @donne;
@pivot=split(':',$pivot[0]);
$bu=$pivot[1];
}else{
print "Valeur du BU non trouvee pour $nom\n";
}

if("@donne" =~ /G1/){
@pivot=grep{$_=~/G1/} @donne;
@pivot=split('..........',$pivot[0]);
$G1=$pivot[1];
}else{
print "Valeur de G1 non trouvee pour $nom\n";
}

if("@donne" =~ /G2/){
@pivot=grep{$_=~/G2/} @donne;
@pivot=split('..........',$pivot[0]);
$G2=$pivot[1];
}else{
print "Valeur de G2 non trouvee pour $nom\n";
}

if("@donne" =~ /N1/){
@pivot=grep{$_=~/N2/} @donne;
@pivot=split('..........',$pivot[0]);
$N1=$pivot[1];
}else{
print "Valeur de N1 non trouvee pour $nom\n";
}

if("@donne" =~ /N2/){
@pivot=grep{$_=~/N2/} @donne;
@pivot=split('..........',$pivot[0]);
$N2=$pivot[1];
}else{
print "Valeur de N2 non trouvee pour $nom\n";
}


if("@donne" =~ /R/){
@pivot=grep{$_=~/R/} @donne;
@pivot=split('..........',$pivot[0]);
$R=$pivot[1];
}else{
print "Valeur de R non trouvee pour $nom\n";
}
}

}else{
print "Le Fichier Listing n'existe pas pour le fichier $nom \n";
}


### On enlève tous les carractères non désirables
($relative=$relative)=~ s/\D*\W*\s*//g;
($bore=$bore)=~ s/\D*\W*\s*//g;
($bu=$bu)=~ s/\D*\W*\s*//g;
($G1=$G1)=~ s/\D*\W*\s*//g;
($G2=$G2)=~ s/\D*\W*\s*//g;
($N1=$N1)=~ s/\D*\W*\s*//g;
($N2=$N2)=~ s/\D*\W*\s*//g;
($R=$R)=~ s/\D*\W*\s*//g;

print "Valeur Relative $relative \n";
print "Valeur bore $bore \n";
print "Valeur BU: $bu \n";
print "valeur position grappe: G1 $G1 G2 $G2 N1 $N1 N2 $N2 R $R \n";

}

7 réponses

Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
27 mai 2014 à 16:35
Désolé du double post mais je sais pas si j'ai été clair...


J'ai abondonné l'idée sur les opérateurs d'intervalles, je trouve très peu de document mise à part un bouquin que j'ai sous la main.
Je continue avec une à la palce sans réussite
for($m=0;$m<$M;$m++){
if($com[$m]=~/GENERALES/){
while($com[$m]=~/COMMENTAIRES/){
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
27 mai 2014 à 17:37
Alors j'ai avancé et j'ai réusis !

J'ai utilisé:
@donne=grep{$_=~/DONNEES GENERALES/ ... /COMMENTAIRES/}@com;

Donc j'arrive à récupérer la plage de donnée que je voulais. Pour les valeurs qui sont précédé de ":" j'arrive à les extraire.

Le seul problème c'est pour les autres, ceux précédé par ".......... " (5 dernières valeurs).

J'ai essayé avec :

if("@donne" =~ /G1/){
@pivot=grep{$_=~/G1/} @donne;
@pivot=split('..........',$pivot[0]);
$G1=$pivot[1];
}else{
print "Valeur de G1 non trouvee pour $nom\n";
}

et ça marche pas.... Vous avez des idées svp ?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 27/05/2014 à 18:52
Salut Akre66,

Les points dans le premier argument de split doivent être échappés si tu veux matcher des points. Autrement le
.
signifie : tout caractère.

Donc cela donnerait quelque chose comme :

@pivot=split('\.\.\.\.\.\.\.\.\.\.',$pivot[0]);


Mais utiliser split pour faire ce que tu fais est inadapté.

Ce que je ferai, c'est faire de ton tableau un scalaire avec join et d'y appliquer une regexp unique avec le modificateur
s
pour capturer à travers les lignes ce qui t'intéresse entre "DONNEES GENERALES" et "COMMENTAIRES LIBRES".

Cela tient en une seule regexp et en deux lignes avec la ligne appliquant le join.


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
27 mai 2014 à 19:06
avec un fichier de données comportant

                                                                                                                                                                                                                   

DONNEES GENERALES
-----------------


CENTRALE....................: XXX
TRANCHE.....................: X
CYCLE.......................: X
EPUISEMENT MOYEN............: AAAA Mwj/T
PUISSANCE NOMINALE..........: XXX
PUISSANCE RELATIVE..........: AAAA
BORE SOLUBLE................: AAAA
MODE DE PILOTAGE............: X
ENFONCEMENT DES GRAPPES (pas extraits)
G1 .......... AAA
G2 .......... AAAA
N1 .......... AAAA
N2 .......... AAAA
R .......... AAAA




COMMENTAIRES LIBRES
-------------------

Truc, machin, bidule PUISSANCE RELATIVE, N1, R.

et un script Perl comme celui-ci :

#!/usr/bin/perl
use strict;
use warnings;
             
my $filename = "akre66_test2.txt";
my $FILE;
 
open($FILE,$filename) or die("Fichier $filename introuvable");                                                                                                                                                     
my @contenu = <$FILE>;
close($FILE);
 
$_ = join("", @contenu);
if (/.*\s+DONNEES\sGENERALES.*EPUISEMENT\sMOYEN\.+:\s+([^\s]+)
    .*PUISSANCE\sRELATIVE\.+:\s+([^\s]+)
    .*BORE\sSOLUBLE\.+:\s+([^\s]+)
    .*G1\s+\.+\s+([^\s]+)
    .*G2\s+\.+\s+([^\s]+)
    .*N1\s+\.+\s+([^\s]+)
    .*N2\s+\.+\s+([^\s]+)
    .*R\s+\.+\s+([^\s]+)
    .*\s+COMMENTAIRES\sLIBRES/xs) {
    print "$1\n";
    print "$2\n";
    print "$3\n";
    print "$4\n";
    print "$5\n";
    print "$6\n";
    print "$7\n";
    print "$8\n";
} else {
    print "Erreur de format du fichier $filename\n";
}


on obtient les 8 valeurs capturées :

AAAA
AAAA
AAAA
AAA
AAAA
AAAA
AAAA
AAAA

Si tu veux des explications sur la regexp, je suis à ta disposition. J'ai ajouté le modificateur x pour pouvoir poster la regexp sur plusieurs lignes et qu'elle soit lisible sur le forum.


Dal
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
28 mai 2014 à 09:25
Euh, j'arrive pas à voir ton script uniquement ta première ligne... Comment je fais pour voir le reste ?

Et oui je me doute bien qu'il y avait bien mieux. Je suis pas un spéciatliste informatique et j'ai commencé le perl il y a même pas 2 semaines.
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
28 mai 2014 à 09:26
Et merci du coup déjà pour les explications
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 28/05/2014 à 09:59
Ah, c'est bizarre, chez moi mon post s'affiche correctement depuis Firefox (Iceweasel) ou Chrome.

J'ai mis le code là : https://ideone.com/xZQMxp

légèrement adapté pour les besoins du compilateur en ligne, pour utiliser les données lues à partir d'une section "DATA" au lieu d'un fichier (j'ai commenté les instructions d'ouverture, lecture, fermeture du fichier).

Tu peux aussi y voir le résultat du fonctionnement du script.


Dal
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
28 mai 2014 à 10:10
J'ai ouvert avec Mozilla ça marche.

Bah j'ai continué avec mon idée qui est pas élégante je pense et ça marche (manque quelques détails).
Mais la tienne a l'air super. J'ai du mal à comprendre par contre tout ce qu'il suit de la if.

Tu récupères ce qui derrière les motifs avec un outil que je connais ... Il a un nom pour que je puisse l'étudier ?
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
6 juin 2014 à 09:27
J'ai compris (enfin je crois), je l'ai appliqué et ça marche.

Après on m'a demandé de sortir plus d'informations.
Parfois mais pas tout le temps il y a plus d'informations entre "Données générales" et "Commentaires libres".
Puis parfois les commentaires libres sont remplis et contient des valeurs plus juste pour l'épuissement, le bore et R.

Exemple type(modèle qui ressort souvent)
DONNEES GENERALES
-----------------


CENTRALE....................: XXXX
TRANCHE.....................: X
CYCLE.......................: XX
EPUISEMENT MOYEN............: AAAA Mwj/T
PUISSANCE NOMINALE..........: XXXX Mwth
PUISSANCE RELATIVE..........: AAA %
BORE SOLUBLE................: AAAA ppm
MODE DE PILOTAGE............: G
ENFONCEMENT DES GRAPPES (pas extraits)
G1 .......... AAA
G2 .......... AAA
N1 .......... AAA
N2 .......... AAA
R .......... AAA
!! ATTENTION !!
POUR LES CPY, LES VALEURS RENSEIGNEES POUR LES GROUPES DE COMPENSATION DE PUISSANCE DOIVENT ETRE
VERIFIEES (AU MOYEN DES COMMENTAIRES OU D'UNE SOURCE EXTERNE) SI AU MOINS UN DES GROUPES EST DONNE INSERE

NUMERO DE CARTE.............: XX


CETTE CARTE CONTIENT BBB TRACES REPARTIES EN 15 PASSAGES,

ELLE A ETE CREEE LE 10/11/94 A 09:00.


N.B. LES DONNEES GENERALES PROVIENNENT DE LA CARTE LUE, EVENTUELLEMENT MODIFIEES OU COMPLETEES PAR L'UTILISATEUR.

CENTRALE DE XXXXX TRANCHE X CYCLE X BURNUP X CARTE NUMERO X PAGE X

COMMENTAIRES LIBRES
-------------------


NO: XX
DU: CC/CC/CC
TRAN: X
CAMP: XX
IRRA: AAAA MWJ/T
CB: AAA PPM
D: AAA





$
















CENTRALE DE XXXXX TRANCHE X CYCLE X BURNUP X CARTE NUMERO X PAGE X

MOYENNES DES VALEURS CARACTERISTIQUES DE PASSAGE (NaN INDIQUE UNE MESURE NON VALIDE)
------------------------------------------------

(fin)
A peuvent des décimaux comme des entiers.
Suivi de date (CC/CC/CC) est une date.
BB est entier mais se trouve dans une chaine.

Du coup suivi de ton modèle j'ai fait ça...La première qui est la tienne marche. Quand je l'essaye ça marche pas.

if(/.\s+DONNEES\sGENERALES.*EPUISEMENT\sMOYEN\.+:\s+([^\s]+)
.*PUISSANCE\sRELATIVE\.+:\s+([^\s]+)
.*BORE\sSOLUBLE\.+:\s+([^\s]+)
.*G1\s+\.+\s+([^\s]+)
.*G2\s+\.+\s+([^\s]+)
.*N1\s+\.+\s+([^\s]+)
.*N2\s+\.+\s+([^\s]+)
.*R\s+\.+\s+([^\s]+)

.*\s+COMMENTAIRES\sLIBRES/xs){


$bu=$1;
$relative=$2;
$bore=$3;
$G1=$4;
$G2=$5;
$N1=$6;
$N2=$7;
$R=$8;



}else{
print "Plage de donnée 1 pas trouvée\n";
}

if(/.\s+COMMENTAIRES\sLIBRES.*DU:\s+([^\s]+)
.*IRRA:\s+([^\s]+)
.*CB:\s+([^\s]+)
.*D:\s+([^\s]+)
.*\s*MOYENNES\sDES\sVALEURS\sCARACTERISTIQUES\sDE\sPASSAGE/xs){

$date=$1;
$bu=$2;
$bore=$3;
$R=$4;


}else{
print "Plage de donnée 2 pas trouvée\n";
}

je voulais savoir où était mon erreur (et me l'expliquer) dans la deuxième boucle if... Je me dis que peut etre je peux pas utiliser deux fois "Commentaires libres" (une sortie et une entrée) de la boucle if.
Mais si je fais tous dans la meme boucle et que le commentaires libres est vide (ça arrive) ca marcherait pas.

Aussi je voulais savoir comment récupérer les informations contentus dans une chaine de carractère grace à cette boucle if.


Enfin bref je suis perdu...
Merci beaucoup
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
6 juin 2014 à 10:18
J'ai trouvé mon erreur...
Je faisais un grep avant (car sinon ça marchait pas trop) et j'avais oublié d'agrandirl'ensemble.

J'ai donc tout sauf le "BB" qui se trouve dans une phrase...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
6 juin 2014 à 11:46
Oui, j'ai testé ta 2ème regexp et elle fonctionne bien.

Tu peux appliquer autant de tests que tu veux sur les mêmes données de départ, tant que $_ n'est pas modifié.

Stp, quand tu postes des données, c'est important que tu les mettes dans des balises "code" :

<code>
    Données ici
------------
</code>

pour que l'on sache exactement comment sont structurées tes lignes. Sinon le html écrase les espaces vides.

Pour capturer les données BBB, consistant en des valeurs numériques entières se trouvant dans "CETTE CARTE CONTIENT BBB TRACES REPARTIES EN 15 PASSAGES", tu peux modifier la 1ère regexp pour capturer une 9ème donnée en insérant le motif suivant en avant-dernière ligne :

    .*CETTE\sCARTE\sCONTIENT\s([0-9]+)\sTRACES\sREPARTIES\sEN\s[0-9]+\sPASSAGES



Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 6/06/2014 à 12:04
hmm, à la réflexion, tu dis :

Parfois mais pas tout le temps il y a plus d'informations entre "Données générales" et "Commentaires libres".

si cela veux dire que la ligne "CETTE CARTE CONTIENT BBB TRACES REPARTIES EN 15 PASSAGES" peut ne pas de trouver dans ta 1ère partie, la 1ère regexp va échouer lorsque cette ligne ne s'y trouve pas.

Donc, le plus simple serait d'utiliser une regexp séparée pour vérifier si cette partie contient, ou non, cette ligne.

Il faut penser que tes regexp sont non seulement un moyen de capture de l'information, mais aussi un moyen de validation de la structure attendue.


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
6 juin 2014 à 12:10
Note aussi que tu commence tes regexp ainsi :

if(/.\s+


ce qui veux dire : n'importe quel caractère une fois, suivi de caractères blancs une ou plusieurs fois.

ce n'est pas tout à fait ce que j'avais écrit au départ, même si cela ne semble pas avoir d'impact sur tes données.

ma regexp commençait ainsi :

if (/.*\s+


ce qui veux dire : n'importe quel caractère zéro ou plusieurs fois, suivi de caractères blancs une ou plusieurs fois.

cela permet de matcher la section qui t'intéresse même s'il y a des informations parasites avant.


Dal
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
6 juin 2014 à 11:47
Et j'ai trouvé pour l'autre...
rien ne changeait, on s'en moque un peu de ce qu'il y a derrière comme le programme.
Tout marche comme sur des roulettes merci
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
6 juin 2014 à 11:50
ok, bravo :-)
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
26 juin 2014 à 15:44
Bonjour,
Je cherche à developper un nouveau script. Il devra un moment préléver toutes les données (issus du programme fait plus haut) pris entre deux "titres" avant de passer à la porchaine plage donnée

Exemple:
Titre N (soit $Titre[$n])
AAAAA
AAAAA
....
AAAA
Titre N+1 (soit $Titre[$n+1])



Les titres sont déjà écris dans un tableau.

Je pense donc à réaliser un grep entre ces deux titres.

@sortie=grep{$_=~/$T[$n]/.../$Titre[$n+1]/}@entree;


Vous en pensez quoi ?
0
Akre66 Messages postés 55 Date d'inscription mercredi 14 mai 2014 Statut Membre Dernière intervention 4 octobre 2016
26 juin 2014 à 17:03
Donc ça marche mais le soucis c'est pour le dernier...

Je pense faire une condition pour ce cas, mais comment lui faire comprendre que c'est le dernier (soit que n+1 n'existe pas) ?
0