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

Signaler
Messages postés
16
Date d'inscription
mardi 2 avril 2013
Statut
Membre
Dernière intervention
21 mars 2014
-
Messages postés
16
Date d'inscription
mardi 2 avril 2013
Statut
Membre
Dernière intervention
21 mars 2014
-
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.

3 réponses

Messages postés
3647
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
23 octobre 2020
971
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 60511 internautes nous ont dit merci ce mois-ci

Messages postés
16
Date d'inscription
mardi 2 avril 2013
Statut
Membre
Dernière intervention
21 mars 2014

Ok merci pour ces explications, ça devrait être possible de faire ce remplacement en Fortran directement, je cherche ça.
Messages postés
16
Date d'inscription
mardi 2 avril 2013
Statut
Membre
Dernière intervention
21 mars 2014

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 !