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 :

Sélectionner lignes dans un tableau selon valeur colonne


Sujet :

Fortran

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

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Sélectionner lignes dans un tableau selon valeur colonne
    Bonjour,

    Je viens de commencer la programmation en langage FORTRAN. J'ai réussi à développer un début de programme mais je reste bloquée depuis un très long moment sur quelque chose qui va surement vous paraitre tout bête...

    J'ai un tableau composé de 10 variables (numériques et alphanumériques) et d'un nombre de lignes variables (je veux dire que selon le début du programme, le nombre de lignes peut varier). Je souhaite sélectionner les lignes dont la colonne 6 porte une valeur alphanumérique précise, et ensuite de ces lignes, je ne veux garder que les colonnes 1 et 4. Le résultat doit sortir dans un nouveau fichier.

    J'ai essayé de plusieurs façons, mais le fichier de sortie que j'obtiens est toujours vide. En plus, le tableau de départ (à 10 variables) est en fait un tableau qui est sorti en fichier fortran des lignes de programme avant. Du coup, je ne sais pas si il est reconnu comme étant un tableau...

    J'espère avoir été assez claire, merci beaucoup d'avance pour vos réponses...

  2. #2
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    Salut,

    Comme tu as des variables alphanumérique - des chiffres et des lettres (ToutouyouTouuuutoutdoutouyouTouyouToudoud…ou)- il va falloir que tu utilises des lettres (la lettre "1" pour ne citer que elle). Ensuite il faut que tu te crées une petite sous-routine qui va pouvoir lire les mots de ton tableau (tableau de pointer sur des chaines de charactères). La fonction iachar qui prend une lettre (ASCII) en argument et te retourne l'entier correspondant, ainsi que la table de correspondance (par exemple tu peux la trouver ici : http://www.asciitable.com/ ) te seront utiles. Pour pouvoir récupérer la nieme lettre d'un mot il faut utiliser la syntaxe char=string(n:n), string(n) n'étant pas suffisant. Pour le reste c'est juste une histoire de boucles que tu as certainement déjà codées.

    En espérant éclairer ta lanterne

    Bonne soirée.

  3. #3
    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 : 84
    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!
    J'ai un tableau composé de 10 variables (numériques et alphanumériques) et d'un nombre de lignes variables (je veux dire que selon le début du programme, le nombre de lignes peut varier).
    Est-ce que ce tableau provient d'un fichier que ton programme lit?
    Jean-Marc Blanc

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses. Je vais continuer d'essayer maintenant.

    Concernant la question:
    "Est-ce que ce tableau provient d'un fichier que ton programme lit?"

    Oui, en effet, le fichier est créé avant par mon programme, et je demande donc à le réutiliser. Est-ce un problème ?

    Merci beaucoup !

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Par rapport à votre réponse, j'ai de nouvelles questions:

    "Comme tu as des variables alphanumérique - des chiffres et des lettres (ToutouyouTouuuutoutdoutouyouTouyouToudoud…ou)- il va falloir que tu utilises des lettres (la lettre "1" pour ne citer que elle). Ensuite il faut que tu te crées une petite sous-routine qui va pouvoir lire les mots de ton tableau (tableau de pointer sur des chaines de charactères). La fonction iachar qui prend une lettre (ASCII) en argument et te retourne l'entier correspondant, ainsi que la table de correspondance (par exemple tu peux la trouver ici : http://www.asciitable.com/ ) te seront utiles. "

    1) Mes variables alphanumériques sont de la forme 'CO123456789', donc si je dois changer ces variables en numériques, il faudrait changer que les deux premières lettres non ?

    2) Mes colonnes de tableaux n'ont pas de noms. Comment je peux convertir les colonnes en numériques avec la fonction Iachar puisque je ne peux pas appeler mes colonnes ?

    "Pour pouvoir récupérer la nieme lettre d'un mot il faut utiliser la syntaxe char=string(n:n), string(n) n'étant pas suffisant. Pour le reste c'est juste une histoire de boucles que tu as certainement déjà codées"

    3) Je ne veux pas forcément récupérer une lettre d'un mot, mais les valeurs des entiers numérique (situés dans les colonnes 1 et 4) correspondant à la valeur 'CO123456789' inscrite en colonne 6 ?

    Aille aille aille... Je suis pas sure de m'être fait comprendre la première fois...

    Merci pour vos aides !!!!

  6. #6
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    re-salut,

    J'ai été assez vague, c'est vrai, mais je voulais juste donner quelques briques. Voici quelques éclaircissements.



    1) Mes variables alphanumériques sont de la forme 'CO123456789', donc si je dois changer ces variables en numériques, il faudrait changer que les deux premières lettres non ?


    En fait je pensais changer toute la variable en chaine de caractères ; la chaine "CO12345678" par exemple. Je pensais que tu pouvais avoir des lettres en plein milieu de ta variable, si tu as seulement que deux lettres au début tu pourrais faire un type dérivé du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       TYPE ton_type
          CHARACTER(len=2) :: prefix ! pour stocker le "CO"
          INTEGER               :: suffix ! pour stocker le "12345678"
       END TYPE ton_type
    et créer un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       TYPE(ton_type), DIMENSION(:), POINTER :: ton_tableau
    Du coup si tu veux savoir si ton_tableau(i)==CO12345678, tu as juste à faire un test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     ( ton_tableau(i)%prefix=="CO" .and. ton_tableau(i)%suffix==12345678 )





    2) Mes colonnes de tableaux n'ont pas de noms. Comment je peux convertir les colonnes en numériques avec la fonction Iachar puisque je ne peux pas appeler mes colonnes ?

    Ce n'était pas les "noms de colonne" dont je te parlais… quoique tu pourrais essayer de faire un dictionnaire, mais bon… hors sujet je crois. En fait je t'indiquais juste une fonction qui te permets de transformer un caractère en l'entier de la table ASCII, donc juste à faire un test == après.


    "Pour pouvoir récupérer la nieme lettre d'un mot il faut utiliser la syntaxe char=string(n:n), string(n) n'étant pas suffisant. Pour le reste c'est juste une histoire de boucles que tu as certainement déjà codées"

    3) Je ne veux pas forcément récupérer une lettre d'un mot, mais les valeurs des entiers numérique (situés dans les colonnes 1 et 4) correspondant à la valeur 'CO123456789' inscrite en colonne 6 ?


    En fait les deux briques IACHAR et l'astuce du string permettent de construire une sous routine qui va te permettre de pouvoir lire ta variable et finalement de savoir si c'est bien elle que tu voulais choisir/éliminer.


    Bonne journée

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ta réponse détaillée. Cependant, je n'arrive toujours pas à résoudre mon problème car je n'arrive pas à bien utiliser tous tes conseils !

    En fait, pour récupérer les lignes intéressantes, et les placer dans un fichier temporaire, j'ai fait quelque chose comme ça:


    open (2,file="ped",action="read", status="old")
    open (3,file="liste", status="new",access="direct")
    do i=1, n
    read (2,*) codei,codem,codep,annee,sexe,id,idp,idm,gra,grb
    if (id(i).eq.idfem) write (3,*) codei
    end do
    close (2)
    close (3)

    Mon fichier temporaire "liste" ne se crée pas du tout. Quelqu'un aurait-il une idée pourquoi ?

    Merci beaucoup!!!!

  8. #8
    Membre régulier
    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
    Points : 89
    Points
    89
    Par défaut Sélectionner lignes dans un tableau selon valeur colonne
    Bonjour Jessie,

    je n'ai pas d'idée du pourquoi ton fichier ne se créé pas. La solution c'est d'y aller par étapes.
    Donc je t'encourages à définir des sous questions.

    1) Le fichier ne se crée pas ou rien n'est écrit dedans ?
    Tu peux par exemple après avoir ouvert ton fichier écrire n'importe quoi dedans

    Par exemple, tu peux tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    open (3,file="liste", status="new",access="direct") 
    write(3,*)"Un Truc de test"
    Et voir si le fichier se créé bien, sinon, peut-être devrais tu rester sur une version plus simple de ton open, e.g. :
    2) Est-ce que ta condition se vérifie au moins une fois ?
    Pour celà, remplace juste ton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (id(i).eq.idfem) write (3,*) codei
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (id(i).eq.idfem) write (*,*) "La condition est verifiee en ligne",i
    Si la condition n'est jamais vérifiée, essaies de voir si les variables sont bien lues (une lecture formatée pourrait te simplifier la lecture). Autre point essaie de voir si tu n'as pas de problèmes avec les longueurs de tes chaines par exemple es-tu sûr que tu n'as pas d'espace en début ou fin de la chaine "idfem" ou "id(i)"

    Tiens nous au courant de tes avancées.

    Bon courage.

  9. #9
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour

    Merci beaucoup pour vos aides et conseils: Ca marche !

    Cependant, le fichier de sortie est présenté de sorte que les chiffres des colonnes sont alignés à droite. Or j'aimerai qu'ils soient alignés à gauche.

    Aujourd'hui, mon format est de la forme:
    format (i2,3x,i1).

    Quelqu'un aurait-il une idée pour m'aider de nouveau ?

    MERCI !!!!!

  10. #10
    Membre régulier Avatar de rogue-spectre
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 104
    Points : 122
    Points
    122
    Par défaut
    tout marche ? ou seulement la création du fichier ?
    c'est bizarre cette histoire d'alignements. Tu peux montrer à quoi ressemble ton fichier de sorti. Sinon si tu veux virer les espaces de début de ligne, le truc que j'ai utilisé une fois c'est d'écrire ta ligne non pas directement dans un fichier mais dans une variable de type chaine de caractères, ensuite tu peux faire un traitement plus poussé de ta chaine pour supprimer d'éventuels symboles ou simplement écrite ta variable dans le fichier en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       write(unit_de_ton_fichier, '(A)') ADJUSTL(ta_chaine_de_charactere)
    Tu peux également voir les résultats de trim, et adjustr.

    Bonne journée

  11. #11
    Membre régulier
    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
    Points : 89
    Points
    89
    Par défaut Alignement à gauche
    Salut Jessie,

    comme le souligne rogue spectre aligner à gauche c'est surprenant !
    Car en général :
    visuellement ça déstabilise pour connaître la valeur la plus grande (ça se fait, mais pas aussi naturellement AMHA)...du coup, je me dis que peut-être la définition de ton problème nécessite qq précisions.

    Tu obtiens des colonnes qui ressemblent à :
    et tu voudrais quelque chose comme cela ?:
    Si oui, en fait l'astuce de rogue spectre devrait marcher.
    Si non, est-ce que tu ne veux pas plutôt coller la variable de ta seconde colonne à la variable de ta première colonne ? (Genre tu veux reconstituer un identifiant qui serait constitué d'un indicatif de pays, d'un département (numérique) et d'un autre chiffre

    => Un exemple de ce que tu as et de ce que tu voudrais aiderais pas mal à t'aider !

  12. #12
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Salut !

    C'est bon, ça marche ! Pour aligner les valeurs à gauches, j'ai bien changé ma variable integer en variables character et ensuite utilisé "adjustl".

    Alors, concrètement ça donne ça:

    integer codei
    character*10 dummy

    open (2,file="file1",action="read", status="old",iostat=iocode)
    open (9,file="liste", status="unknown")
    do while (iocode.eq.0)
    read (2,*,iostat=iocode) codei,sexe,id
    if ((id.eq.idfem).or.(id.eq.idmale)) then
    write(dummy,'(i3)') codei
    write(9,99) adjustl(dummy),sexe
    99 format (A6,I1)
    endif
    enddo

    Et voilà !

    En tout cas merci à tout le monde pour l'aide et les conseils !!!!

  13. #13
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    J'ai un nouveau petit défi...

    Je suis toujours sur le même programme. Maintenant j'essaye de regarder une par une les valeurs d'un fichier (ref), pour les comparer avec une colonne (id) d'un autre fichier (pedut). Dès que id=idref, il faudrait qu'il m'écrive les valeurs de code correspondants. Voici ma partie de programme :

    open (2,file="pedut",action="read",status="old",iostat=iocode)
    open (1,file="ref",status="old",iostat=ioref)
    open (9,file="liste", status="unknown")

    do while(ioref.eq.0)
    read (1,*,iostat=ioref) idref
    if (ioref.eq.0) then
    do while(iocode.eq.0)
    read (2,*,iostat=iocode) codei,codem,codep,annee,sexe,
    + id,idp,idm,gra,grb
    if (id.eq.idref) write (9,*) codei,sexe
    enddo
    endif
    enddo

    close (9)
    close (1)
    close (2)

    En ce moment, le programme fait bien ce qu'il faut, mis à part, qu'il ne lit que la première valeur du fichier ref et s'arrête ensuite. Je pense qu'il y a un problème dans la façon dont j'écris les boucles, mais je suis un peu perdue...

    Quelqu'un pourrait-il me venir en aide de nouveau ?
    Merci...

  14. #14
    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 2 problèmes importants :
    • À la lecture de la deuxième valeur de ref, ton programme est rendu à la fin du fichier pedut. Avant d'entrer dans la 2ième boucle il faut faire un rewind du fichier pedut.
    • Les variables ioref et iocode ne sont pas mise à zéro avant les tests.

    De plus, plutôt que d'utiliser des "do while", il est plus simple pour ce genre de problème d'utiliser des "do" sans test et d'en sortir par un exit :

    Au lieu de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ioref = 0
    do while(ioref == 0)
       read (1,*,iostat=ioref) idref
       if (ioref.eq.0) then
          ...
       endif
    enddo
    Tu pourrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    do
       read (1,*,iostat=ioref) idref
       if (ioref /= 0) exit
       ...
    enddo

  15. #15
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour cette réponse rapide !

    J'ai bien essayé comme tu m'as dit, cependant, maintenant je n'ai plus rien (j'ai demandé un print, mais rien ne s'affiche, et pourtant sans message d'erreur). Alors, le code a un peu changé (car j'ai eu besoin de changer les fichiers, mais ce que je veux faire est identique) et donc, ça donne ça :

    io=0
    iocode=0
    open (7, file="resngen", status="old",iostat=iocode)
    open (9,file="liste", status="unknown",iostat=io)
    do
    read (9,*,iostat=io) codei,sexe
    if (io.ne.0) exit
    if (io.eq.0) then
    do
    if (iocode.ne.0) exit
    if (iocode.eq.0) then
    rewind (7)
    read (7,37,iostat=iocode) codein,gen1,gen2,gen3,gen4,
    + gen5,gen6,gen7,gen8
    if (codei.eq.codein) print*, codein, gen1,gen2
    endif
    enddo
    endif
    enddo
    37 format (i2,8F3.2)
    close (9)
    close (7)

    Je ne suis pas sure de la position de mon rewind. Pourtant, j'ai cherché et lu des codes utilisant des rewind, et c'était souvent mis comme ça.
    Est-ce que quelqu'un a une idée de mon erreur ?

    Merci de nouveau

  16. #16
    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
    Tu ne sembles pas analyser très longtemps ce que tu code...
    Citation Envoyé par jessie1611 Voir le message
    if (iocode.ne.0) exit
    if (iocode.eq.0) then
    ...
    endif
    Le deuxième if est inutile. La condition sera toujours vraie puisque tu as éliminé les cas iocode /= 0 à la ligne précédente.
    Citation Envoyé par jessie1611 Voir le message
    do
    rewind (7)
    read (7,37,iostat=iocode) codein,gen1,gen2,gen3,gen4,
    + gen5,gen6,gen7,gen8
    enddo
    Si tu rewind le fichier avant chaque lecture, tu risques de lire très souvent la première ligne...

  17. #17
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2011
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Salut !

    Désolé pour toutes mes questions et mes interrogations, c'est vrai que parfois c'est dur de voir ces erreurs, surtout pour un débutant,

    en tout cas merci beaucoup, parce que ça marche maintenant

    MERCI MERCI MERCI !!!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/03/2014, 00h31
  2. nombre de lignes dans une table selon valeur
    Par halimux dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/01/2014, 11h55
  3. Réponses: 0
    Dernier message: 10/07/2013, 10h01
  4. Réponses: 1
    Dernier message: 12/12/2008, 18h06
  5. [HTML] Sélectionner une ligne dans un tableau en html
    Par jehlg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 16/06/2008, 12h55

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