Bonjour !
Pour exposer rapidement la situation, je dispose d'une série de fichiers, rangés dans des dossiers par année (2011, 2012 et 2013), qui sont tous construits de la même façon :
Code :
- nomdemonfichier.txt DUREE : 164 mn
- DUMONT D'URVILLE Backscatter lidar LOANA
- DATE : 14/02/2011 HEURE DEB. : 12:13:06 FIN : 14:57:47
- LATITUDE : -66.41 LONGITUDE : 140.01
|
J'ai fait une routine qui extrait ces informations, utilisant une structure de type ENTETE adaptée, elle marche au poil :
Code :
- PROGRAM Monprog
- IMPLICIT NONE
- ! Déclaration des types dérivés
- TYPE ENTETE
- CHARACTER (len=20) :: Nom_fichier
- CHARACTER (len=14) :: Id_Duree_Session ! Permet de récupérer " DUREE : "
- CHARACTER (len=3) :: Duree_Session
- CHARACTER (len=4) :: Unit_Duree_Session !permet de récupérer ' mn'
- CHARACTER (len=23) :: Site
- CHARACTER (len=23) :: Instrument
- CHARACTER (len=15) :: Id_Date ! Permet de récupérer " DATE : "
- CHARACTER (len=10) :: Date
- CHARACTER (len=16) :: Id_Heure_debut ! Permet de récupérer " HEURE DEB. : "
- CHARACTER (len=8) :: Heure_debut
- CHARACTER (len=9) :: Id_Heure_fin ! Permet de récupérer " FIN : "
- CHARACTER (len=8) :: Heure_fin
- CHARACTER (len=19) :: Id_Latitude ! Permet de récupérer " LATITUDE : "
- CHARACTER (len=6) :: Latitude
- CHARACTER (len=24) :: Id_Longitude ! Permet de récupérer " LONGITUDE : "
- CHARACTER (len=6) :: Longitude
- END TYPE
- ! Programme
- IMPLICIT NONE
- CHARACTER(len=255) :: Fichier !Adresse du fichier à lire
- TYPE(ENTETE) :: Header
- INTEGER (kind=4) :: ios, Size_record
- INQUIRE(IOLENGTH=Size_record) Header
- OPEN( UNIT=1, &
- FILE=Fichier, &
- FORM="unformatted", &
- ACCESS="direct", &
- STATUS="old", &
- ACTION="read", &
- RECL=Size_record, &
- IOSTAT=ios )
- IF (ios/=0) THEN
- PRINT *,"Erreur ",ios
- ELSE
- READ(UNIT=1, IOSTAT=ios, REC=1) Header
- END IF
- CLOSE(UNIT=1)
- END PROGRAM
|
.... mais seulement pour les fichiers des années 2011 et 2012 !
En effet pour 2013, un décalage se produit à chaque saut de ligne. Par exemple, si je veux récupérer l'année dans mon fichier, en 2012 je récupère bien la chaîne de caractères "2012", alors qu'en 2013 le décalage fait que je récupère "2/20" (càd une partie du numéro du mois + le séparateur mois/année - lorsque j'ai besoin de convertir cette chaîne en entier, forcément le programme n'apprécie pas...).
Il se trouve que les fichiers 2011 et 2012 ont leurs sauts de ligne codés sur 1 caractère (norme UTF8, sous Linux) alors que ceux de 2013 ont leurs sauts de ligne codés sur 2 caractères (codage cp1252 sous Windows).
Quel serait le moyen le plus simple, ou le plus élégant de contourner ce problème svp ?
- Créer une deuxième structure "ENTETE2013" qui prend en compte la taille des sauts de ligne
- 'Recoder' tous les fichiers de 2013 en UTF-8 ? (il y en a un bon paquet, je ne sais pas comment ça se fait à la main, existe-il une solution automatisée?)
- Une solution qui permettrait de conserver la structure telle que je l'ai créée, mais qui indiquerait à la fonction READ que les sauts de ligne ne sont pas codés de la même manière ?
- Ou une autre solution ?
Je vous remercie par avance pour votre aide
Yannick.
Message édité par infrarouge77 le 12-03-2014 à 11:09:26