[FORTRAN]Gestion sauts de ligne Windows/Linux fichier txt (1/2o)

Résolu/Fermé
InfraRouge77 Messages postés 16 Date d'inscription mardi 2 avril 2013 Statut Membre Dernière intervention 21 mars 2014 - Modifié par InfraRouge77 le 12/03/2014 à 11:09
InfraRouge77 Messages postés 16 Date d'inscription mardi 2 avril 2013 Statut Membre Dernière intervention 21 mars 2014 - 12 mars 2014 à 16:46
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 :


 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 :

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.
A voir également:

3 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
12 mars 2014 à 11:38
Bonjour,

Je ne connais pas le FORTRAN. Mais n'est-il pas possible de recoder toi-même à la volée les sauts de lignes, en remplaçant dans chaque ligne les '\r\n' par des '\n' ?

Xavier

PS : le problème ne vient pas de l'encodage UTF-8 ou cp1252, mais uniquement du caractère de saut de ligne. Réencoder en UTF-8 n'y changera rien.
1
InfraRouge77 Messages postés 16 Date d'inscription mardi 2 avril 2013 Statut Membre Dernière intervention 21 mars 2014
12 mars 2014 à 12:34
Ok merci pour ces explications, ça devrait être possible de faire ce remplacement en Fortran directement, je cherche ça.
0
InfraRouge77 Messages postés 16 Date d'inscription mardi 2 avril 2013 Statut Membre Dernière intervention 21 mars 2014
12 mars 2014 à 16:46
Ca marche impeccablement en effet, et ce directement depuis mon programme en fortran, avec ces deux lignes de commande :

Cmde = " cat monfichier.txt | tr -d '\r' > monfichier.temp"
CALL SYSTEM(Cmde)


Ainsi on crée un fichier temporaire sans les \r qui m'embêtaient...

Merci encore !
0