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

 Delphi Discussion :

lecture d'un fichier text


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut lecture d'un fichier text
    Bonsoir

    veuillez me montrer comment lire le contenu d'un fichier text (ligne par ligne), évidement comment l'ouvrir puis le fermer.

    Merci d'avance

  2. #2
    Membre chevronné Avatar de archonte
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 342
    Par défaut
    Salut !

    j'ai tapé ta question dans et surprise : il y a plein de réponses ... dont par exemple celle-ci sur ce site !
    Allez, un petit effort de lecture ==

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    Merci pour ta réponse
    je vais voir

    (Je n'ai de problème avec la lecture)

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Pourquoi ne pas passer par un TStingList. C'est particulièrement pratique et cela ne nécessite que très peu d'efforts.

    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
     
    uses Classes
     
    ......
     
    var
      AFile: TStringList;
      I: integer;
    begin
      AFile := TStringList.Create;
      try
        AFile.LoadFromFile('c:\monFichier.txt');
        for I := 0 to Pred(AFile.Count) do
          showMessage(AFile.Strings[I]);
      finally
        AFile.Free;
      end;
    end;
    La propriété Strings te permet d'accéder au contenu de chaque ligne de ton fichier texte.

    La propriété Text te permet d'acceder au contenu complet de ton fichier.

    Tu pourrais également non pas utiliser un TStingList mais un TStrings (classe abstraite) qui peut s'avérer très pratique pour certains traitements.

    Par exemple, tu charges le contenu de ton fichier texte dans un TMemo afin de l'afficher à l'écran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure test1(AFile: TStrings);
    var
      I: integer;
    begin
      for I := 0 to Pred(AFile.Count) do
         showMessage(AFile.Strings[I]);
    end;
     
    procedure TMaForm.Button2Click(Sender: TObject);
    begin
      memo1.Lines.LoadFromFile('c:\MonFichier.txt');
      test1(memo1.Lines);
    end;
    Va voir dans l'unité classes et tu découvriras de nombreuses choses autour de cette gestion de listes.

  5. #5
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    Salut,

    Pascal, peux-tu nous dire stp, quelle est la différence entre cette variante de boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // La tienne :
    for I := 0 to Pred(AFile.Count) do
    // Celle que j'utilise toujours :
    for i := 0 to AFile.Count - 1 do

  6. #6
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Le résultat obtenu est le même donc on peut indifféremment utiliser l'une ou l'autre méthode.

    Si j'utilise le Pred, c'est sutout par réflexe et c'est devenu un indicateur visuel lors d'une relecture rapide de mon code.

  7. #7
    Membre Expert
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 288
    Par défaut
    En tous les cas, réponse très instructive car Pred() au niveau débutant n'est pas trop utilisé.

    Merci Pascal

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    bonjour
    merci Pour vos réponses

    votre méthode marche bien. Mais j'ai encore un petit problème dans mon programme; lorsque je converti la chaine suivante (enregistré dans le fichier txt par un autre programme VB6)
    par la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val(AFile.Strings[i],x,e);
    je trouve dans x la valeur 4 (comme s'il ne lit que le premier chiffre)

    y a t-il une explication

    Merci encore

  9. #9
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Attention le décimal separator est à priori la virgule.

    Donc ajouter en début de procédure

    Decimalseparator = ',';


    Pour le changement de format, je te conseille un StrToFloat comme ceci

    x := StrToFloat(AFile.Strings[i]);

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    Merci beaucoup Pascal , le problème est résolu avec

    (sans avoir ajouter decimal separator)

    autre chose:
    Dans le cas ou le fichier contient de données séparées par des ";" (ou autres) comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     7,397128 ;-2,091842 ;-2,612865 ;-3,352107
    existe t-elle un méthode prédéfinie pour les extraire chacune à part (je suis en train de faire un petit programme qui le fait en utilisant les fonctions de chaines de caractères (pos, length,.......) dans le cas contraire
    A +

  11. #11
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Par défaut
    Citation Envoyé par guefrachi Voir le message
    (sans avoir ajouter decimal separator)

    Fais attention sur différent poste (seven, ou autre xp) tu aura des surprises....

    Citation Envoyé par guefrachi Voir le message
    ....
    existe t-elle un méthode prédéfinie pour les extraire chacune à part (je suis en train de faire un petit programme qui le fait en utilisant les fonctions de chaines de caractères (pos, length,.......) dans le cas contraire
    A +
    Il y en a pas mal, en voici une que j'utilise :

    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
    function RecupInfoXT(Ligne: String;Position: Integer):String;
    var
      I,IndexID : Integer;
      DebutID: integer;
    Begin
      DebutID := 0;
      IndexID := 1;
      result := '';
      For I := 0 to Length(Ligne) do
      begin
        if IndexID = Position then break;
        if Ligne[i] = ';' then Inc(IndexID)
      end;
      DebutID := i;
      for i := DebutID to Length(Ligne) do
      begin
        if Ligne[i] = ';' then Break;
        result := result+ligne[i];
      end;
    End;
    Position = 1 vaut le premier, etc... apres tu peux boucler..


  12. #12
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    Merci de répondre

    j'ai essayé ta méthode, elle donne de résultat pour position>1, mais pour position =1 elle ne retourne rien (chaine vide peut être).

    Mais en attendant une réponse j'ai pensé à cette méthode
    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
     tpos[1]:=posex(';',Ligne,1);
         
         j:=2;
         while (posex(';',ligne,tpos[j-1]+1)<>0) do
    
         begin
         tpos[j]:=posex(';',ligne,tpos[j-1]+1);
             
                     j:=j+1;
           end;
    
         chaine[1]:=copy(ligne,1,tpos[1]-1);
         chaine[2]:=copy(ligne,tpos[1]+1,tpos[2]-(tpos[1]+1));
         chaine[3]:=copy(ligne,tpos[2]+1,tpos[3]-(tpos[2]+1));
              chaine[4]:=copy(ligne,tpos[3]+1,length(ligne)-(tpos[3]+1));
    peut être elle manque de généralisation (insertion d'un boucle pour les chaine[i]) mais elle donne des bons résultats.
    c'est la première version

    tant qu'il n y a pas une méthode prédéfinie, c'est donc de l'algorithmique à faire.

  13. #13
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    J'aurais tendance à vous proposer cette méthode.

    Si tes chaînes sont toujours formatées ainsi :

    '7,397128 ;-2,091842 ;-2,612865 ;-3,352107 '

    Alors utilise encore les TStringList ou TStrings de la façon suivante :

    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
     
    procedure ValuesExtract(AsT : string; AValues: TStrings);
    begin
      AValues.Delimiter := #0;
      AValues.QuoteChar := ';';
      AValues.DelimitedText := Ast;
    end;
     
     
    procedure test;
    var
      AList: TStringList;
      I: integer;
      AsT: string;
    begin
      AList := TStringList.Create;
      try
        AsT := '7,397128 ;-2,091842 ;-2,612865 ;-3,352107 ';
     
        ValuesExtract(AsT, AList);
     
        for I := 0 to Pred(AList.Count) do
          if Trim(AList[I]) <> ''
            then showMessage(Trim(AList[I]));
     
      finally
        AList.Free;
      end;
    end;

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    Si tes chaînes sont toujours formatées ainsi :

    '7,397128 ;-2,091842 ;-2,612865 ;-3,352107 '
    je peux avoir d'autre formats dans mon fichier, puisqu'il résulte d'un programme de calcul (sous VB6), je peux avoir des nombre sans chiffre après la virgule....
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     7,397128 ;-2,091842 ;-2,612865 ;-3,352107 
     9,207355 ; 0,81449 ; 0,7090379 ; 4,535276E-02 
     9,987475 ;-6,051562E-02 ; 1,160159 ; 0,6723038
    Merci pour la réponse

  15. #15
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    Normalement cela ne devrait donc pas poser de problème

  16. #16
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    effectivement

    Merci beaucoup

  17. #17
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    salut
    j'ai essayé de faire la combinaison pour appliquer cette méthode aux lignes de fichier mais elle se produit une erreur d'exécution. Voici le code
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    procedure TForm1.Button4Click(Sender: TObject);
    var
      AList: TStringList;
      i,J: integer;
      AsT: string;
    begin
      AList := TStringList.Create;
        AFile := TStringList.Create;
          Decimalseparator := ',';
     
      /////////////////////////////////////////////////////////////
        try
        AFile.LoadFromFile('c:\new1.txt');
     
        for i := 0 to  pred(AFile.Count) do
        begin
            AsT :=AFile.Strings[i];
          try
     
        ValuesExtract(AsT, AList);
     
        for J := 0 to Pred(AList.Count) do
          if Trim(AList[J]) <> ''
            then
            begin
            t[J+1]:=strtofloat(Trim(AList[J]));
            end;
            list2.AddItem(floattostr(t[1]),list2);
            list3.AddItem(floattostr(t[2]),list3);
            list4.AddItem(floattostr(t[3]),list4);
            list5.AddItem(floattostr(t[4]),list5);
      finally
        AList.Free;
      end;
     
         end;
     
      finally
     
        AFile.Free;
        end;
      ///////////////////////////////////////////////////////////////
     
    end;

  18. #18
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Par défaut
    effectivement tu ne crées qu'une seule instance de AList que tu détruis lors de la première boucle. En l'occurrence, lors de la seconde boucle plus aucune instance de AList n'est présente.

    Reprend plutôt la structure suivante :

    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
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
      AList: TStringList;
      I,J: integer;
      AsT: string;
    begin
      Decimalseparator := ',';
      AFile := TStringList.Create;
      try
        AFile.LoadFromFile('c:\new1.txt');
        for I := 0 to  pred(AFile.Count) do
        begin
          AList := TStringList.Create;
          AsT :=AFile.Strings[I];
          try
            ValuesExtract(AsT, AList);
            for J := 0 to Pred(AList.Count) do
              if Trim(AList[J]) <> ''
                then t[J+1]:=strtofloat(Trim(AList[J]));
          ......................................
          finally
            AList.Free;
          end;
        end;
      finally
        AFile.Free;
      end;
    end;

  19. #19
    Membre confirmé
    Inscrit en
    Janvier 2010
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 177
    Par défaut
    Je vous remercie vivement

    problème

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

Discussions similaires

  1. Lecture d'un fichier texte dans un projet TOMCAT
    Par brice_nice dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 03/07/2005, 16h04
  2. lecture d'un fichier texte
    Par benahpets dans le forum MFC
    Réponses: 5
    Dernier message: 22/06/2005, 12h50
  3. [C#] Lecture d'un fichier texte (farfelu)
    Par choas dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/04/2005, 15h33
  4. Lecture d'un fichier Texte
    Par jcharles dans le forum Bases de données
    Réponses: 8
    Dernier message: 27/10/2004, 15h58
  5. Stockage de données & lecture d'un fichier texte
    Par petitours dans le forum C++Builder
    Réponses: 6
    Dernier message: 13/03/2004, 15h05

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