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 :

fonction recherchev() sous fortran


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut fonction recherchev() sous fortran
    voilà mon soucis étant novice en fortran

    j'aimerais faire une recherche dans un fichier txt séparé par ";"
    fichier source qui est en fait une table de donneés:

    0;1;2;3;4;5
    1200;360;0,35;0,36;0,36;0,37
    1300;395;0,36;0,65;0,36;0.47
    1500;395;0,35;0,36;0,37;0,38

    exemple je recois deux valeur

    la premiere n:1300 et l'autre m:3

    comment récupérer la valeur croisé càd 0.65

    en sachant que la premiere ligne correspond aux positions de colonne "m"
    et la premiere colone à la position de ligne "n"

    peut ton faire des requete a partir de fichier

  2. #2
    Membre émérite Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Par défaut
    tu as plusieurs solutions, la plus simple, si ta base de donnée (ton fichier.txt) n'est pas trop énorme: c'est de charger tout dans un tableau, ensuite les recherche dans le tableua seront facilité.

    sinon, si on suppose que ta base de donnée a pu (par malchance, mais il faut toujours imaginer le pire) intervetir des colonnes, mais que la première ligne te donne le nombre de colonnes (et le nombre de ligne ce serai sympa aussi) et la seconde te donne cet ordre (en gros une ligne qui te donne le numéro de la colonne)

    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
     
    integer,dimension(:) :: ordre
    character(len=255) :: ligne
    integer i,j
     
    open(unit=15,file="<ton_fichier>",status="unknown")
    read(11,*) Nmax,Mmax
    allocate( ordre(0,Mmax) )
    read(11,'(a)')ligne
    ligne=trim(ligne)
    j=0
    do while (len(ligne>0)  
      do i=1,len(ligne)
         if (ligne(i)==";") then
           read(ligne(1:i-1),*)ordre(j)
           j=j+1
           write(ligne,*)ligne(1:i-1)
         end if
      end do
    end do
    ce qui a pour effet te te crer un tableau de corespondance, maintenant on va chercher la ligne qui a le numéro N (N=1300 par exemple):
    (surtout ne pas refermer le fichier entre les deux étapes)
    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
     
    do i=1,Nmax
      read(11,'(a)')ligne
      do i=1,len(ligne)
         if (ligne(i)==";") then
           read(ligne(1:i-1),*)numero
           exit
         end if
      end do
      if (numero==N) then
        exit
      end if
    end do
    !on a la bonne ligne, on peut refermer le fichier
    close(11)
    !on remplit un tableau qui contient toutes les valeurs de la ligne:
    j=0
    do while (len(ligne>0)  
      do i=1,len(ligne)
         if (ligne(i)==";") then
           read(ligne(1:i-1),*)tabligne(j)
           j=j+1
           write(ligne,*)ligne(1:i-1)
         end if
      end do
    end do
    !on veut maintenant la valeur de la colonne numéro M, mais elle est peut-
    !être dans le désordre donc on utilise le tableau de correspondance:
    val=talligne(ordre(M))
    et voilou!!!!
    attention cependant certaines vérifications supplémentaires sont à effectuer pour évité les erreurs de lectures, prévenir le programme que le fichier texte n'est pas complètement correct...etc...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut
    oh merci je vais essayer et je te dis quoi

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 7
    Par défaut non résolu
    quelqu'un serai t-il là pour m'aider ça serai vraiment cool
    je sais pas comment ça fonctionne?

  5. #5
    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
    Par défaut
    Salut!
    je sais pas comment ça fonctionne?
    Ta question est incompréhensible: c'est quoi ça?
    Jean-Marc Blanc

  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
    Par défaut
    Faire un RechercheV n'a pas directement de sens en Fortran. La syntaxe du RechercheV vient du fait que Excel n'est pas vectoriel. Ainsi, l'expression Excel

    RechercheV(cle,Tableau, Colonne)

    devrait s'écrire en Fortran :

    Tableau(Trouve(Cle,ListeDesCles), Colonne)

    Les différences à prendre en considération :
    • En Fortran, tout le tableau doit être du même type. La colonne des clés doit donc généralement être stockée dans un vecteur distinct du tableau et le tableau ne contiendra que les valeurs (colonnes 2 et plus). (On va supposer ici que toutes les valeurs du tableau sont du même type)
    • En Fortran, il n'est pas possible de retourner directement « non disponible ». Si tu dois traiter ces cas, il faut alors séparer la recherche de ligne de la référence au tableau et tester entre les 2 si le numéro de ligne est valide (k = Trouve(Cle,ListeDesCles); if (k > 0) OK else Erreur;

    La difficulté est plutôt de lire le tableau si tu ne connais pas le nombre de lignes ou de colonnes. Selon la taille du tableau, le fait qu'il soit trié ou non, le nombre de recherche que tu dois faire, etc, tu devras décider si tu charge à l'avance tout le tableau en mémoire ou si tu lis le fichier à chaque recherche.

    Si tu relis à chaque recherche, ton algorithme aura la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    rewind(11)
    do
       read(11,'(a)') Ordre, Valeurs(:)
       if (Ordre == Indice recherché) exit
    enddo
    Valeur recherché = Valeurs(Colonne - 1)
    Si tu dois lire une seule fois le tableau, tu dois plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    do k = 1, NbLigne
       read(11,'(a)') Ordre(k), Valeurs(:,k)
    enddo
    pour charger le tableau. Tu devras ensuite écrire la fonction Trouve.

    Finalement, si je me fie à ton exemple, tu devras également traiter les séparateurs décimales «,» et de champs «;». La façon la plus simple est généralement de lire la ligne au complet dans une variable caractère suffisamment longue, de remplacer les délimiteurs, puis de faire un internal read :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    read(11,'(a)') Ligne
    do k = 1, len_trim(Ligne)
       if (Ligne(k:k) == ';') Ligne(k:k) = ' ' ! ou char(9), soit un TAB
       if (Ligne(k:k) == ',') Ligne(k:k) = '.'
    enddo
    read(Ligne,*) Ordre(i), Valeurs(:,i)

Discussions similaires

  1. Equivalent à la fonction RECHERCHEV sous excel ?
    Par feboici dans le forum kettle/PDI
    Réponses: 9
    Dernier message: 06/11/2008, 18h39
  2. Existe-t-il une fonction Eval() sous Delphi ?
    Par Hell dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2004, 18h45
  3. Fonction "Format" sous SQL
    Par Fabby69 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 08/10/2004, 10h07
  4. fonction "inb" sous linux; port parallele
    Par be_net dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/06/2004, 12h39
  5. Fonction EXTRACT sous Informix
    Par lord_of_ankou dans le forum Informix
    Réponses: 3
    Dernier message: 20/08/2003, 18h37

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