Précédent   Forum du club des développeurs et IT Pro > Autres langages > Autres langages > Fortran
Fortran Forum d'entraide sur la programmation en Fortran. Avant de poster -> FAQ Fortran
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/07/2011, 17h04   #1
walos
Invité de passage
 
Homme
Étudiant
Inscription : 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 : 0
Points : 0
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
Type de fichier : txt input file.txt (661 octets, 3 affichages)
walos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 17h56   #2
FR119492
Rédacteur/Modérateur
 
Jean-Marc Blanc
Inscription : avril 2007
Messages : 2 837
Détails du profil
Informations personnelles :
Nom : Jean-Marc Blanc
Âge : 72

Informations forums :
Inscription : avril 2007
Messages : 2 837
Points : 3 971
Points : 3 971
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)
FR119492 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 20h28   #3
Sylvain Bergeron
Modérateur
 
Inscription : août 2006
Messages : 781
Détails du profil
Informations personnelles :
Localisation : Canada

Informations forums :
Inscription : août 2006
Messages : 781
Points : 1 028
Points : 1 028
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 :
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 :
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.
Sylvain Bergeron est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2012, 05h14   #4
labtoy
Futur Membre du Club
 
Inscription : juillet 2011
Messages : 90
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 90
Points : 18
Points : 18
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 :
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 !
labtoy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2012, 07h59   #5
Ehouarn
Membre éclairé
 
Inscription : mars 2007
Messages : 326
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 326
Points : 378
Points : 378
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.
Ehouarn est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2012, 15h46   #6
jlcech
Invité de passage
 
Homme Jean-Louis Cech
Ingénieur systèmes et réseaux
Inscription : septembre 2012
Messages : 3
Détails du profil
Informations personnelles :
Nom : Homme Jean-Louis Cech
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 : 3
Points : 3
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.
jlcech est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h08.


 
 
 
 
Partenaires

Hébergement Web