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 :

Lire la ligne suivante si #


Sujet :

Fortran

  1. #1
    Invité
    Invité(e)
    Par défaut Lire la ligne suivante si #
    Bonjour,

    Peu expérimentée en langage Fortran et habituée à Matlab, la lecture d'un fichier reste un mystère pour moi ...

    Je voudrais que mon code lise la première ligne : si elle commence par #, alors il abandonne la lecture et passe à la ligne suivante.
    Si c'est trop compliqué, je souhaiterais savoir comment lire un fichier .txt à partir d'une ligne donnée.

    Je voudrais aussi que mon code supprime les lignes commençant par #, ou les n premières lignes si c'est trop compliqué.

    Merci pour votre aide !
    Dernière modification par Invité ; 23/07/2012 à 03h10.

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 79
    Par défaut Passer une ligne commençant par #
    Une solution, est de lire en deux temps ton fichier. Dans un premier temps, on lit une ligne (line) d'une longueur arbitrairement longue (ici 3000 caractères). Ensuite après avoir retiré les espaces à droite et à gauche (le résultat est affecté à lines2), on teste le premier élément de la variable obtenue. Si ce dernier est le signe # on passe à la lecture suivante (cycle) , sinon on relit notre ligne de longueur arbitraire (lines 2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ReadLoop:do 
           read(10,'(a30000)',iostat=io)line
           if(io/=0)exit
           lines2=trim(adjustl(line))
           if(lines2(1:1)=="#")cycle
           read(lines2,'(a,a30000)')key,lines
    end do ReadLoop
    Voilà une solution, il y en a sans doute de plus élégantes ou portables...avis aux experts.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je comprends le raisonnement, merci.
    Comment faire maintenant pour supprimer ces lignes sans créer de nouveau fichier ?

    Merci à vous !

    PS : pourquoi faut-il que iostat=0 ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 79
    Par défaut
    1)
    Comment faire maintenant pour supprimer ces lignes sans créer de nouveau fichier ?
    Considère juste que l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    read(lines2,'(a,a30000)')key,lines
    Représente l'instruction de lecture que tu aurais voulu avoir si ton fichier à lire avait été totalement homogène (sans commentaire, ni lignes à passer). à partir de là, tu fais ce que tu veux...stockage des données lues dans un tableau, compte du nombre de lignes valides pour dimensionner un tableau de stockage etc...En tout cas, tu n'as aucune obligation de créer un nouveau fichier sans ces lignes (car à la rigueur sous linux grep -v "#" TonFichier "serait plus efficace !

    2)
    PS : pourquoi faut-il que iostat=0 ?
    Celle-là c'est une question de base.... donc un petit tour sur la FAQ devrait t'aider.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Je comprends, mais j'utilise un même fichier à en-têtes ('#') à plusieurs reprises dans mon code. J'aurais donc préféré supprimer l'en-tête une fois pour toute en début de code.

    Par contre, si cela est impossible sans réécrire un nouveau fichier, j'aime autant utiliser un éditeur de texte classique. Je suis preneuse pour la solution quand même cela dit !

    Merci beaucoup !

    PS : Petite question : un CALL SYSTEM avec la ligne de commande grep... ne serait-il pas plus simple ? Je n'ai jamais utilisé CALL SYSTEM, je viens de le découvrir.
    Dernière modification par Invité ; 25/07/2012 à 09h09.

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 79
    Par défaut
    1) Si tu veux réécrire une copie de ton fichier expurgée des commentaires, alors, en supposant que tu aies ouvert un fichier de sortie associé à l'unité 11. Ton code sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ReadLoop:do 
           read(10,'(a30000)',iostat=io)line
           if(io/=0)exit
           lines2=trim(adjustl(line))
           if(lines2(1:1)=="#")cycle
          write(11,'(a30000)')line
    end do ReadLoop
    L'écriture (ligne 6) dans le fichier associé à l'unité 11 ne sera effectué que si tu n'as pas de signe # (ligne 5).
    Ensuite, un rewind sur l'unité 11 et tu pourras lire ce nouveau fichier.

    2) Sinon, tu peux appliquer le système de lecture en deux temps à chaque fois que cela est nécessaire, i.e. à chaque lecture du fichier avec commentaires (ou mieux tu transformes cette lecture en sous-routine, que tu appelleras plusieurs fois).
    Bref bien des possibilités s'offrent à toi. Je dois avouer que je ne comprends pas pourquoi le code proposé ne résoud pas le problème.

    3) Enfin, le format du fichier que tu veux lire est peu défini, mais si en fait tu n'as qu'une ligne de header et que cette dernière est unique et toujours la première du fichier, après ouverture de ton fichier tu peux faire une lecture bidon, puis entammer la lecture a proprement parler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    !Ouverture du fichier
    open(10,file="FichierAvecHeader.txt")
    !Lecture de la première ligne (header)
    read(10,'(a30000)',iostat=io)line
    !Debut vraie lecture
    ReadLoop:do 
           read(10,'(i4,i8)',iostat=io)Variable1,Variable2
           if(io/=0)exit
    end do ReadLoop

    Donc
    A) Il y a plein de solutions possibles, il faut juste que tu définisses mieux ton problème, sinon, les gens auront du mal à t'aider.
    B) Attention, toutes les solutions ne se valent pas en termes d'efficacité, donc quantifie bien le temps que prends chaque lecture de ton fichier, l'espace en mémoire que nécessite les données lues. En fonction de cela tu verras s'il vaut mieux faire une seule lecture et stocker en mémoire les données lues ou si vraiment il est préférable de recourir à des lectures successives de ton fichiers.

    Bon courage

    PS : Si tu travailles sur linux, oui tu peux passer par un grep dans un call system (ou mieux un EXECUTE_COMMAND_LINE qui fait partie de la norme fortran 2008). Par contre si ton code doit être utilisé sur windows, ça ne fonctionnera pas.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Eh bien, me voilà comblée :)
    Merci pour toutes ces explications.

    Pour répondre à la question, mon fichier est un .dat qui aurait entre 10 et 20 lignes d'en-têtes.

    Quant au code proposé, il résout totalement le problème. Je trouvais simplement fastidieux de réécrire le code de double-lecture à chaque fois ; je n'avais pas pensé à utiliser une subroutine. Merci !
    Quant à écrire un nouveau fichier, j'ai actuellement un problème de mémoire sur mon ordinateur, c'est pourquoi j'essayais d'éviter. Mais j'ai bien compris le principe, pas d'inquiétude.

    Merci beaucoup.

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

Discussions similaires

  1. Lire des lignes suivant un filtre spécifique
    Par kythi dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 20/03/2013, 16h53
  2. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38
  3. VBA EXCEL - Sélection d'une ligne suivant saisie
    Par brethomeau dans le forum Macros et VBA Excel
    Réponses: 48
    Dernier message: 15/11/2005, 17h41
  4. [BATCH] lire chaque ligne d'un fichier texte
    Par bartmarley dans le forum Windows
    Réponses: 13
    Dernier message: 22/04/2005, 21h01
  5. [TP]lire une ligne de l'ecran et la stocker dans une chaine
    Par Bleuarff dans le forum Turbo Pascal
    Réponses: 26
    Dernier message: 02/07/2002, 10h08

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