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 :

Format de lecture dépendant d'une variable


Sujet :

Fortran

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    aéronautique
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Format de lecture dépendant d'une variable
    Bonjour à tous,

    Je cherche désespérément une solution à mon problème, du coup j'espère pouvoir trouver une réponse ou une piste ici : )

    Alors en quelques mots, voici ce que je cherche à faire :

    - J'ai un fichier txt d'entrée (fichier_a_lire.txt) dans lequel se trouve 3 colonnes.
    - Je souhaite lire le contenu de ces colonnes via les variables nommées (variable_1, variable_2 et variable_3)
    - Ensuite je réécris ces variables dans le fichier de sortie (resultat_lecture.txt) uniquement pour vérifier que ce qui est lu est bien ce que je veux.

    Jusque là tout va bien.

    La contrainte est que le contenu de la colonne numéro 2 peut être amener à être remplie par une valeur de plus de 8 caractères et du coup le format de lecture n'est plus adapté...

    Du coup en gros je voudrais pouvoir adapter le format de lecture par rapport au nombre de caractère contenu dans la collone n°2. Je pensais le faire en faisant intervenir une variable mais dès que j'essaye de mettre une variable dans l'expression du format le compilateur me sort une erreur (compilateur GNU fortran compiler au passage).

    Avec mes recherches j'ai vu la possibilité de mettre un <variable> juste après le "A" (définissant que l'on veut lire une variable type CHARACTER) dans l'expression du format mais apparment ça ne marche qu'avec certains compilateurs.

    J'espère être clair : p

    Le bout de code actuel est comme ceci

    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
    18
    19
          program LECTURE
     
    	     IMPLICIT NONE
     
             CHARACTER*20 X,variable_1,variable_2,variable_3
     
     
          OPEN(UNIT=2,FILE='fichier_a_lire.txt')
          OPEN(UNIT=3,FILE='resultat_lecture.txt')
     
     
        1 READ(2,101) variable_1,variable_2,variable_3
     
      101 FORMAT(A8,1X,A8,1X,A8)
     
          write (3,101) variable_1,variable_2,variable_3
     
     
          END
    Le contenu du fichier à lire est tout simplement :
    100 |101 |102 |

    Merci beaucoup à tous.

    Bonne soirée : )

  2. #2
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Le fichier contient vraiment des barres verticales ? Et tu dois lire uniquement du texte ? Que fais-tu si la colonne 2 excède les 8 caractères ? Tu tronques ou tu aimerais conserver ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    aéronautique
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonsoir !

    Merci de prendre du temps pour me répondre : )

    Malheureusement oui il y a des barres comme séparateur de colonne.

    Pour ce qui est du texte, non j'ai un mix en fait. En réalité la première colonne est un entier, la 2 et 3ème sont de type character et ensuite il y a des réels dans d'autres colonnes encore.

    En revanche, uniquement la seconde colonne peut être amener à changer de taille (pas au sein d'un même fichier mais d'un fichier à l'autre ça peut arriver).

    J'ai simplifié ça en trois colonnes de texte juste le temps de trouver la solution pour implanter la largeur de la colonne 2 comme variable du format.

  4. #4
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Voici des pistes de solution :

    Piste 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    character (200) :: Ligne
    integer :: k
    ...
    read(11,'(a)') Ligne
    do k = 1, len_trim(Ligne)
       if(Ligne(k:k) == '|') Ligne(k:k) = char(9)
    enddo
    read(Ligne,*) ta liste de variables
    ...
    Avantage: simple
    Désavantage: pas très robuste si le fichier est construit « à bras ».

    Piste 2

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    character (200) :: Ligne
    integer :: Pos, Long
    ...
    read(11,'(a)') Ligne
    Pos = 1
    Long = len_trim(Ligne)
    call ExtraitEntier(Variable1,Ligne,Pos,Long)
    call ExtraitTexte(Variable2,Ligne,Pos,Long)
    call ExtraitReel(Variable3,Ligne,Pos,Long)
    ...
     
    subroutine ExtraitTexte(Valeur,Chaine,Debut,Long)
       character (*), intent(out) :: Valeur
       character (*), intent(in) :: Chaine
       integer, intent (inout) :: Debut
       integer, intent (in) :: Long
     
       integer PosBarre
     
       if (Pos > Long) then
          Valeur = ''
       else
          PosBarre= index(Chaine(Debut:Long),'|') + Debut- 1
          if (PosBarre < Debut) PosBarre = Long + 1
          Valeur = Chaine(Debut:PosBarre - 1)
          Debut = PosBarre + 1
       endif
       end
     
    subroutine ExtraitEntier(Valeur,Chaine,Debut,Long)
       integer, intent(out) :: Valeur
       character (*), intent(in) :: Chaine
       integer, intent (inout) :: Debut
       integer, intent (in) :: Long
     
       character (20) Extrait
     
       call ExtraitTexte(Extrait,Chaine,Debut,Long)
       if (len_trim(Extrait) == 0)
          Valeur = 0
       else
          read(Extrait, *) Valeur
       endif
       end
    ...
    Avantage: robuste et permet un décodage plus sophistiqué. Par exemple, des dates ou des codes, des validations, ...
    Désavantage: Plus complexe et plus lourd.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    aéronautique
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci Sylvain !

    Normalement, ce type de fichier arrive propre donc je ne pense pas qu'il y ait forcément besoin que ça soit super robuste.

    J'aurais donc tendance à m'orienter vers ta piste n°1, pour laquelle j'ai besoin de quelques explications :

    En gros si j'ai bien compris ;
    - Tu considères la ligne entière comme une variable
    - Ensuite tu extrais la longueur de cette variable en supprimant les blancs au bout tu as donc la longueur "réelle" de la ligne
    - Tu boucles de la première colonne à la Nème

    - Là en revanche je ne comprend pas trop ce que tu fais. Si la valeur lue de la colonne k vaut "|" alors tu convertis cette valeur en type character sur 9 digits ? (c'est bien ça le "char(9)" ?)

    - Ensuite sur ta commande READ, il me semblait que le premier argument de cette commande devait être l'unité correspondant au fichier considéré. Du coup en faisant read(ligne,*) quel est ton but ?

    Désolé de poser les questions comme ça, je n'ai pas le soft sur le pc duquel j'écris pour pouvoir essayer de comprendre en débuguant

    Merci encore !

  6. #6
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par stainer Voir le message
    ...En gros si j'ai bien compris ;
    - Tu considères la ligne entière comme une variable
    - Ensuite tu extrais la longueur de cette variable en supprimant les blancs au bout tu as donc la longueur "réelle" de la ligne
    - Tu boucles de la première colonne à la Nème
    Jusque là, ça va effectivement.
    Citation Envoyé par stainer Voir le message
    - Là en revanche je ne comprend pas trop ce que tu fais. Si la valeur lue de la colonne k vaut "|" alors tu convertis cette valeur en type character sur 9 digits ? (c'est bien ça le "char(9)" ?)
    Je remplace les "|" par des marqueur de tabulation (char(9) est le caractère 9 en décimal). Pourquoi ? Parce que le read format libre (*) aime beaucoup ça comme séparateur de champs.
    Citation Envoyé par stainer Voir le message
    - Ensuite sur ta commande READ, il me semblait que le premier argument de cette commande devait être l'unité correspondant au fichier considéré. Du coup en faisant read(ligne,*) quel est ton but ?
    ...
    La source d'un read peut être un fichier (via un unit), ou une variable caractère (ou même un tableau caractères).

    Globalement, je fais donc :

    • Lire la ligne dans une variable caractère
    • Modification de la ligne pour avoir un format acceptable
    • Affectation (via un read) du contenu de la ligne à une liste de variables

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    aéronautique
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ahhhhhh Ok !! Merci beaucoup. J'aurais appris des choses au passage : )

    J'aurais le soft demain à dispo pour adapter ça à mon code. Je repasserais ici d'ici demain donc !

    Bonne soirée et encore merci

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    aéronautique
    Inscrit en
    Juin 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : aéronautique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Le soucis est résolu, je me suis débrouillé en partant du bout de code donné plus haut !

    Merci encore !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Définition de variables dépendant. . .d'une variable
    Par ted the Ors dans le forum Général VBA
    Réponses: 1
    Dernier message: 12/02/2010, 16h47
  2. Tracer une courbe avec couleur dépendant d'une variable
    Par etienne.clopeau dans le forum Calcul scientifique
    Réponses: 9
    Dernier message: 07/03/2009, 20h10
  3. Réponses: 2
    Dernier message: 03/03/2009, 10h10
  4. format ordre des modalités d'une variable
    Par eamoros dans le forum SAS Base
    Réponses: 2
    Dernier message: 10/02/2009, 18h25
  5. Point d'arrêt dépendant d'une variable
    Par oodini dans le forum Visual C++
    Réponses: 4
    Dernier message: 30/08/2007, 15h04

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