[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

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 :
 
 

Code :
  1. nomdemonfichier.txt      DUREE : 164 mn
  2. DUMONT D'URVILLE      Backscatter lidar LOANA
  3. DATE       : 14/02/2011   HEURE DEB. : 12:13:06   FIN : 14:57:47
  4. 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 :
  1. PROGRAM Monprog
  2. IMPLICIT NONE
  3. ! Déclaration des types dérivés
  4. TYPE ENTETE
  5. CHARACTER (len=20) :: Nom_fichier
  6. CHARACTER (len=14) :: Id_Duree_Session ! Permet de récupérer "      DUREE : "
  7. CHARACTER (len=3) :: Duree_Session
  8. CHARACTER (len=4) :: Unit_Duree_Session !permet de récupérer ' mn'
  9. CHARACTER (len=23) :: Site
  10. CHARACTER (len=23) :: Instrument
  11. CHARACTER (len=15) :: Id_Date ! Permet de récupérer " DATE       : "
  12. CHARACTER (len=10) :: Date
  13. CHARACTER (len=16) :: Id_Heure_debut ! Permet de récupérer "   HEURE DEB. : "
  14. CHARACTER (len=8) :: Heure_debut
  15. CHARACTER (len=9) :: Id_Heure_fin ! Permet de récupérer "   FIN : "
  16. CHARACTER (len=8) :: Heure_fin
  17. CHARACTER (len=19) :: Id_Latitude ! Permet de récupérer " LATITUDE       : "
  18. CHARACTER (len=6) :: Latitude
  19. CHARACTER (len=24) :: Id_Longitude ! Permet de récupérer "   LONGITUDE         :  "
  20. CHARACTER (len=6) :: Longitude
  21. END TYPE
  22. ! Programme
  23. IMPLICIT NONE
  24. CHARACTER(len=255) :: Fichier !Adresse du fichier à lire
  25. TYPE(ENTETE) :: Header
  26. INTEGER (kind=4) :: ios, Size_record
  27. INQUIRE(IOLENGTH=Size_record) Header
  28. OPEN( UNIT=1,   &
  29.   FILE=Fichier,  &
  30.   FORM="unformatted", &
  31.   ACCESS="direct", &
  32.   STATUS="old",  &
  33.   ACTION="read",  &
  34.   RECL=Size_record, &
  35.   IOSTAT=ios  )
  36. IF (ios/=0) THEN
  37.   PRINT *,"Erreur ",ios
  38. ELSE
  39.   READ(UNIT=1, IOSTAT=ios, REC=1) Header
  40. END IF
  41. CLOSE(UNIT=1)
  42. 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
Reply

Marsh Posté le 12-03-2014 à 11:08:29   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed