[Fortran 90] Choix de séparateur pour lecture dans un fichier
Bonjour
J'espère que ma question ne se trouve pas déja dans les archives, j'ai recherché à la main puis avec le moteur sans trouver. Désolé si c'est le cas.
En gros j'ai un fichier de donnée que j'ai enregistré au format csv, les différentes valeurs sont donc séparées par des virgules. Je voudrai savoir si vous connaissez un moyen pour que le caractère virgule soit reconnu comme un séparateur lors de la lecture dans fortran90?
Je vais vous donner un exemple de ce que je fais pour montrer pourquoi je demande ca.
J'ai dans mon fichier de données des lignes de type:
"toto,374.2,1438.558413,24.87403093,142.4000" *ligne de type 1
"t,380.6,1438.079111,24.87407659" *ligne de type 2
Pour l'instant ma lecture se fait en utilisant :
Code:
1 2 3 4 5
| wfile=10
OPEN(UNIT=wfile,FILE=namefile1,FORM="FORMATTED",STATUS="OLD",ACCESS="sequential",ACTION="read")
READ(wfile,FMT='(A,F7.2,F12.8,F12.8)') dummy,tread, xread, pread
READ(wfile,FMT='(A,F7.2,F12.8,F12.8)') dummy,tread, xread, pread
close(wfile) |
Avec dummy de type CHAR(1) un string de dimension 1 parce que la plupart des lignes ne contiennent pas de string au debut (type 2) et pour l'instant j'ai une subroutine qui va d'abord chercher la ligne de type 1 et commence a lire les donnees en utilisant la lecture ci-dessus a ligne suivante, de type 2 (donc sans probleme).
Maintenant je voudrais lire les donnees en position 2 et 3 sur toutes les lignes (meme celles de type 1) . Avec la ligne de commande precedente, ca ne marche pas avec les lignes de type 1 puisque apres avoir lu 1 caractere, il commence a lire le reste du texte pour l' affecter dans un reel, donc plantage. Si je change le type de dummy pour char(50) en supposant que 50 soit la longueur de la chaine de caractere dans le type 1, c' est pour le type 2 que la partie numerique va etre lue dans dummy.
Du coup il serait tres pratique que la virgule soit reconnue comme un separateur : la lecture prendrait un string de longueur 1, puis sauterait apres le separateur pour lire la deuxieme valeur.
Est ce que vous auriez une piste sur comment faire ca ? Ca doit etre simple mais j'ai pas trouve de reponse dans les cours de fortran que j'ai pu trouver en ligne.
En regle generale, existe-t-il un separateur naturel dahs fortran90 lors de lecture ou est-on toujours oblige de connaitre la longueur de ce qu' on veut lire ?
Merci d' avance pour votre aide !
une solution mais pas au probleme general
Bon j'ai trouvé une ruse pour mon cas particulier, j'utilise un read avec advance=no sur un caractere et je continue tant que le caractère lu n'est pas une virgule. Après, je n'ai plus qu'a lancer la lecture des trois variables réelles, sans paramètre advance et rebelote sur la ligne suivante.
En langage fortran90 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| i=0
OPEN(UNIT=wfile,FILE=namefile1,FORM="FORMATTED",STATUS="OLD",ACCESS="sequential",ACTION="read")
do WHILE (i.LT.6)
i=i+1
lengthnotcoma=0
testcoma='B'
DO WHILE (testcoma.NE.',')
READ(wfile,FMT='(A)',ADVANCE='NO') testcoma
END DO
READ(wfile,FMT='(F7.2,F12.8,F12.8)') a(i),b(i),c(i)
END DO
CLOSE(wfile) |
Voilà, c'est bon mais je serais toujours intéressé si quelqu'un connaissait la réponse sur d'éventuels séparateurs possible lors de la lecture de données. Ca serait super pratique je trouve.