IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

[Fortran 77] Formatage sortie .csv


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut [Fortran 77] Formatage sortie .csv
    Bonjour,

    Je débute en F77, et j'ai des problèmes de formatage
    Mon fichier de sortie doit imperativement etre au format csv avec un séparateur de champs point virgule et un séparateur décimal point.
    La premiere ligne du fichier doit aussi contenir des chaines de caractères.

    je voudrai d'une part pouvoir aligner mes champs à gauche, au meme niveau que la premiere ligne (j'ai bidouiller FORMAT sans succès )
    et d'autre part etre capable d'écrire mon point virgule entre chaque champs (
    j'ai essayé de mettre un ";" entre chacune des variables, mais j'obtient des erreurs à la compil)

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    	IF(iinv.eq.0) then
               open(1,file='truc.csv',status='unknown')
             somme=0.
    	 WRITE(1,*)"longitude;latitude;elevation;conc;nvt;dvtx;dvty"
             do i=1,npts
              x=xpts(i)
             do j=1,npts
              y=ypts(j)
             write(1,100)x,y,fpts(i,j),ventno(i,j),acorect(i,j)
    1                ,bcorect(i,j),topohaut(i,j)
             somme=somme+fpts(i,j)
             enddo
             write(1,'()')
             enddo
            close(1)
    et le resultat csv:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    longitude;latitude;elevation;conc;nvt;dvtx;dvty
              0.0000000           0.0000000           0.0000000           4.1898599           
              0.0000000          68.9655151           0.0000000           4.1744800           
              0.0000000         137.9310303           0.0000000           4.1219192           
              0.0000000         206.8965454           0.0000000           4.0344415           
              0.0000000         275.8620605           0.0000000           3.9318738           
              0.0000000         344.8275757           0.0000000           3.8293421
    Est-ce qqn aurait une idée pour que je puisse formater à ma guise ?
    D'avance merci bcp pour votre aide

    PiklaS

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2006
    Messages : 197
    Par défaut
    salut.
    est-ce que tu peut nous donner ton format de label 100 ?
    C'est dans le format qu'il faut jouer.
    Tu pourrait mettre par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    100   FORMAT(6(E12.9,';'),E12.9)
    ça devrait te permettre d'écrire 6 fois un réel de 9décimales (12 caracteres au total) avec le point-virgule, puis un septieme réel, en utilisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(*,100)longitude,latitude,elevation,conc,nvt,dvtx,dvty
    (j'ai pas testé avec le point-virgule directement dans le format, sinon tu remplace par A1, et tu rajoute ';' entre chaque variable envoyée au write :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FORMAT(6(E12.9,A1),E12.9)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(*,100)longitude,';',latitude,';',elevation,etc...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut
    Merci bcp pour vos réponse gregory2526 et Sylvain
    J'avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     100      format(7(f19.7,1x))
    J'essaye vos astuces de ";" dans le format et de A1 et vous tiens au courant
    merci encore pour la réactivité!
    @+
    PikO

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10
    Par défaut formatage csv
    Bonjour,
    Je suis finallement parvenu à formater mon csv
    Par contre j'ai encore un problème d'alignement qui me bloque pour la suite du programme
    En fait mes deux premiers champs sonr de 12 caractères et les suivant que de 9, du coup le compilo me les aligne a droite par defaut, et celà crée des espaces indésirables.

    J'ai bien essayé d'écrire ma ligne dans une variable character (l' exemple VarChar comme indiqué dans un des postes précédents) , mais ne parviens pas à le mettre en oeuvre

    J'essaye donc de resoudre ce problème en faisant deux write obeissant à deux formats différents, mais je n'arrive pas à les écrire sur une mêm ligne (désolé je débute !)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WRITE(1,100)x,y,z
    WRITE (1,101)fpts(i,j),ventno(i,j),acorect(i,j)
              ,bcorect(i,j),topohaut(i,j)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     100      format(7(F12.7,";"))
     101      format(8(F9.7,";"))
    Celà me donne en sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     68.9655151;   0.0000000;   0.0000000;
    0.0000000;2.2281728;1.0000000;1.0000000;0.0000000;
      68.9655151;  68.9655151;   0.0000000;
    0.0000000;2.3535061;1.0000000;1.0000000;0.0000000;
      68.9655151; 137.9310303;   0.0000000;
    0.0000000;2.3432333;1.0000000;1.0000000;0.0000000;
      68.9655151; 206.8965454;   0.0000000;
    0.0000000;2.2240174;1.0000000;1.0000000;0.0000000;
      68.9655151; 275.8620605;   0.0000000;
    0.0000000;2.1084802;1.0000000;1.0000000;0.0000000;
      68.9655151; 344.8275757;   0.0000000;
    0.0000000;2.0060256;1.0000000;1.0000000;0.0000000;
      68.9655151; 413.7930908;   0.0000000;
    0.0000000;1.9176056;1.0000000;1.0000000;0.0000000;
      68.9655151; 482.7586060;   0.0000000;
    et je voudrais obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    68.9655151;0.0000000;0.0000000;0.0000000;2.2281728;1.0000000;1.0000000;0.0000000;
    68.9655151;68.9655151;0.0000000;0.0000000;2.3535061;1.0000000;1.0000000;0.0000000;
    68.9655151;137.9310303;0.0000000;0.0000000;2.3432333;1.0000000;1.0000000;0.0000000;
    68.9655151;206.8965454;0.0000000;0.0000000;2.2240174;1.0000000;1.0000000;0.0000000;
    68.9655151;275.8620605;0.0000000;0.0000000;2.1084802;1.0000000;1.0000000;0.0000000;
    68.9655151;344.8275757;0.0000000;0.0000000;2.0060256;1.0000000;1.0000000;0.0000000;
    68.9655151;413.7930908;0.0000000;0.0000000;1.9176056;1.0000000;1.0000000;0.0000000;
    Quelqu'un à une idée ?
    D'avance merci

    Piklas

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    En Fortran 77, si tu fais 2 writes, tu auras 2 lignes (au moins). De mémoire, tu peux cependant terminer le premier format par \ pour supprimer le changement de ligne, mais je ne suis plus certain si c'est standard ou une extension d'un compilateur particulier.

    En Fortran 90 (et plus), tu aurais pu utiliser ADVANCE='NO' pour avoir une seule ligne.

    De toute façon, tu n'as pas à briser ton write en 2. Tu aurais pu utiliser un format du genre :

    100 format(3(F12.7,";"),8(F9.7,";"))

    Mais tout ça ne règle pas vraiment le problème d'espace. Je n'avais pas testé mon exemple de code avec VarChar, mais il faudrait que tu nous montre ton code source pour qu'on puisse t'aider...

  6. #6
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    pour ne pas retourner à la ligne à la fin d'un write il faut mette '$' dans le format (à la fin du format) genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    write(*,'(a12,$)') "hello world "
    write(*,'(a12,$)') "hello world "
    te fera une sortie "hello world hello world " et je crois bien que cela marche avec le Fortran 77....

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    Pour écrire les ; entre les champs, tu dois placer des ";" dans le format :

    100 format(6(f20.7,";"),f20.7)

    Pour aligner les chiffres à gauche, soit enlever les espaces, c'est plus difficile en f77. Comme plusieurs programmeurs utilisent un compilateur F95 pour faire du F77, essaye de remplacer les f20.7 par f0.7 C'est la technique F95 pour éliminer les espaces devant le chiffre. Peut-être utilises-tu un compilateur F95 sans le savoir.

    L'autre façon de faire consiste à écrire la ligne dans une variable caractère et d'enlever les espaces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    character*(512) VarCar
    ...
    write(VarCar,100)x,y,fpts(i,j),ventno(i,j),acorect(i,j),bcorect(i,j),topohaut(i,j)
    NbCar = 0
    do i=1, len(VarCar)
       if (VarCar(i:i) .ne. ' ') then
          NbCar = NbCar + 1
          VarCar(NbCar:NbCar) = VarCar(i:i)
       endif
    enddo
    write(1,*) VarCar(1:NbCar)
    Tant que tu n'imprime que des nombres, la technique est simple, mais elle se complique très rapidement si tu imprimes aussi du texte contenant des espaces à conserver.

Discussions similaires

  1. REST et sortie CSV
    Par HadanMarv dans le forum Services Web
    Réponses: 7
    Dernier message: 05/12/2011, 10h59
  2. Possibilité BIRT sortie CSV et PDF ?
    Par Pacman23 dans le forum BIRT
    Réponses: 5
    Dernier message: 25/01/2010, 12h57
  3. quickreport et états de sortie CSV pour Excel
    Par konfo dans le forum C++Builder
    Réponses: 0
    Dernier message: 19/01/2009, 13h03
  4. Réponses: 13
    Dernier message: 03/12/2008, 14h54
  5. Spool & Formatage sortie SQL*Plus modifié
    Par Melvine dans le forum Sql*Plus
    Réponses: 7
    Dernier message: 18/05/2006, 14h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo