[FORTRAN] Gestion sauts de ligne Windows/Linux dans fichier txt (1/2o)
Gestion sauts de ligne Windows/Linux dans fichier txt (1/2o) [FORTRAN] - Divers - Programmation
MarshPosté le 12-03-2014 à 11:08:29
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
Marsh Posté le 12-03-2014 à 11:08:29
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 :
J'ai fait une routine qui extrait ces informations, utilisant une structure de type ENTETE adaptée, elle marche au poil :
.... 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