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 :

Extraire une colonne spécifique d'un fichier


Sujet :

Fortran

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Extraire une colonne spécifique d'un fichier
    Bonjour la communauté,
    Je viens juste de me mettre au Fortran et il y a un problème qui me taraude l'esprit depuis. J'aimerais extraire une colonne spécifique à partir d'un fichier txt; et j'aimerais le faire pour plusieurs colonnes et sachant que mes colonnes n'ont pas nécessairement le même nombre de ligne et ce dernier n'est pas connu en avance par exple :

    0 0 6.228 0 0.003 0 0.003
    6.096 0.029 7.353 0.084 0.003 0.336 0.003
    12.192 0.227 9.404 0.168 0.003 0.673 0.003
    18.288 0.431 10.409 0.717 0.309 1.798 0.214
    24.384 1.066 13.24 1.07 0.857 2.489 0.729
    30.48 1.901 16.027 1.281 1.519 2.893 1.396
    36.576 1.41 2.187 3.143 2.092
    42.672 1.485 2.849 3.297 2.79
    48.768 1.53 3.521 3.397 3.49
    54.864 1.564 4.214 3.478 4.196
    60.96 1.597 4.935 3.555 4.919
    67.056 1.633 5.689 3.633 5.672
    73.152 1.784 7.344 3.858 7.338
    79.248 2.3 9.402 4.367 9.4
    85.344 3.759 13.24 5.682 13.24
    91.44 4.912 16.027 6.111 14.208
    97.536 6.761 15.73
    103.632
    109.728
    115.824
    121.92

    supposons que les données ci dessus répresentent notre fichier (voir également le fichier en pièce jointe qui contient les mêmes données)et que l'on veuille par exemple extraire la colonne 3 et la mettre dans une matrice par exemple.
    Quelqu'un pourrait il me donner des pistes, j'ai lu quelques suggestions sur le forum mais, je n'ai pas compris grande chose, je vous en prie de rentrer un peu dans les détails.

    PS: les colonnes sont séparées par des tubulations.

    Je vous remercie d'avance
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    La méthode la plus simple et la plus fréquemment employée consiste à lire chaque ligne de ton fichier comme une chaîne de caractères. Ensuite, tu peux la décortiquer comme tu veux.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  3. #3
    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
    Il y a plusieurs solutions à ce genre de problème. Et quelques difficultés :

    Longueur de la liste

    Tu ne connais pas d'avance le nombre d'éléments d'une colonne. Il n'y a pas, en Fortran, de tableaux dynamiques standard (ou librairies standards) s'étirant au fur et à mesure qu'on y ajoute des éléments.

    La solution commune à ce problème est l'une des suivantes :
    • Lire le fichier « dans le vide » en comptant le nombre d'éléments requis, dimensionner le tableau, « rewinder » le fichier, et lire pour vrai les éléments du tableau.
    • Lire dans un tableau de dimension fixe suffisamment long, et utiliser une variable comme NbrElements donnant le nombre d'élément effectif du tableau.
    • Lire dans un tableau de dimension fixe suffisamment long, puis allouer un deuxième tableau à la dimension requise, puis copier les éléments du premier tableau dans le deuxième.

    Ces solutions évitent l'utilisation de structures dynamiques comme les listes liées, qui sont très lourdes à implanter.

    Données séparées par des tabulations

    Il faut presque obligatoirement passer par un format libre (*) pour traiter simplement ce type de format. Pour avoir la donnée de la colonne n, il faut lire n données à chque ligne, et assigner la donnée n à la position « ligne » du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    k = k + 1
    read(11,*) Donnee(1:n)
    Tableau(k) = Donnee(n)
    Nombre variable d'élément à chaque ligne

    Si tu essaies de lire en format libre n données dans une ligne contenant moins de n données, il y aura saut de ligne et continuité de lecture sur la ou les lignes suivantes, jusqu'à ce que n données aient été lues. Ce comportement est incompatible avec le fait que tu as un nombre variable de données à chaque ligne. Tu auras donc quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    k = k + 1
    read(11,'(a)') Ligne
    calcul du nombre de colonne
    ajustement du format au besoin
    si (NbColonne < n) fin de la lecture, sinon...
    read(Ligne,*) Donnee(1:n)
    Tableau(k) = Donnee(n)


    Tel que suggéré par Jean-Marc, tu dois utiliser une variable caractère intermédiaire et décoder cette variable pour connaitre le nombre d'élément qu'elle contient. Je ne me souviens plus si les tabulations sont des séparateurs de colonne standards. Au besoin, tu pourrais facilement les changer à cette étape.

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

    Si j'ai bien compris, il n'y a pas de possibilité de lire seulement la 3e colonne ?

    Mon problème est que mes fichiers en input sont trèèèèèèèès longs : stocker les colonnes dans des variables prend donc un temps fou (sans vous parler de la mémoire requise ...). Or, dans mes fichiers à 3 colonnes, je n'ai besoin que de la 3e.

    La seule solution que j'ai trouvé est de lire chaque ligne de mon fichier unit=11 comme il suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (boucle sur I)
    READ(11,*) A,A,Z(I)
    où A est une variable bidon. Malgré tout, cela prend du temps.
    Une idée pour lire directement (et uniquement) la 3e colonne ?

    Merci à tous !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 488
    Points : 593
    Points
    593
    Par défaut
    Bonjour,

    Non, il n'y a pas moyen de faire autrement; surtout si les données écrites dans le fichier ne sont pas uniformément formatées.
    La méthode que tu utilises, lire deux variables "bidon" pour évacuer les deux premières colonnes, est adaptée.

    Bonne continuation.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Et Bash dans tout ça
    Bonjour,
    pourquoi se compliquer le vie quand il existe des fonctions toutes faites pour ça.
    un truc disponible sous Linux, Unix, Aix... du style
    cat 'nom du fichier source' | cut -d " " -f 3 > 'nom du fichier destination'
    marche bien.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/08/2011, 17h46
  2. Réponses: 3
    Dernier message: 16/04/2009, 15h00
  3. Ecriture dans une ligne spécifique d'un fichier texte
    Par X-plode dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 15/07/2007, 08h46
  4. Réponses: 7
    Dernier message: 02/07/2007, 16h06
  5. Un lien qui ouvre sur une page spécifique d'un fichier
    Par chpog dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 24/08/2005, 14h56

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