FORUM Tom's Hardware » Programmation » Delphi / Pascal » lecture d'un fichier texte
 

lecture d'un fichier texte

Il y a 291 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici
Ajouter une réponse



 Mot :   Pseudo :  
 
Bas de page
Auteur
 Sujet : lecture d'un fichier texte
 
Plus d'informations

Bonjour,
 
Vous trouverez ci-après le code d'un programmme Pascal qui lit ce fichier afin d'en extraire les valeuurs des lignes.
Ce fichier texte a été créé en convertissant un fichier Excel qui comprenait de multiples lignes et six colonnes.
Le but du programme (qui sera ultérieurement une procédure) est de trouver les valeurs des cellules converties en ligne dans un enregistrement.
J'obtiens ce que je désire ...pour la première ligne et après plus rien.
 
Où est mon erreur ?Que dois je faire pour lire une ligne quelconque et avoir un bon résultat?

Code :
  1. Program joueursH;
  2. uses dos,crt,printer ;
  3. const
  4.      ecran=$b800 ;
  5. var
  6.    f:text ;
  7.    ligne:string;
  8.    j,k,i,l,x,y:integer;
  9.    clt:string   ;
  10.    nomjou:string;
  11.    prenom:string;
  12.    affi:string;
  13.    lf:string ;
  14.    ch:char;
  15.    nclub:string;
  16.    sep:array[1..40] of byte;
  17.    z:char;
  18.    bl:string;
  19. begin
  20.      nclub:='';nomjou:='';prenom:='';lf:='';prenom:='' ;clt:='';affi:='';
  21.      clrscr;
  22.      x:=0;y:=0;
  23.      bl:='                                                   ';
  24.      assign(f,'e:\tennis\advers.txt'); {ouverture du fichier texte }
  25.      {$i-} reset(f) {$i+};
  26.      reset(f);
  27.      z:=chr(9);
  28.    
  29.      while not eof(f) do
  30. {je lis l'entiereté du fichier (je ne pourrais accéder à une 4èmè ligne qu'en lisant les 4 premières et en exploitant la dernière et c'est là que cela ne va plus }
  31.      begin
  32.           l:=0;
  33.           readln(f,ligne);
  34.          l:=length(ligne);
  35.          for j:=1 to l do {je détermine les positions du caractère chr(9) qui sépare mes variables à trouver}
  36.          begin
  37.               x:=x+1;
  38.               if (ligne[j])=chr(9) then
  39.               begin
  40.                    y:=y+1;
  41.                    sep[y]:=x;
  42.               end;
  43.          end;
  44.          for k:= 1 to sep[1]-1 do
  45. {je lis les lignes caractères par caractères pour obtenir la valeur de mes variables ceci marche pour la première ligne mais pas pour les autres                                           }
  46.          begin
  47.               nclub:=nclub+ligne[k] ;
  48.          end;
  49.          for k:= sep[1]+1 to sep[2]-1 do
  50.          begin
  51.                lf:=lf+ligne[k] ;
  52.          end;
  53.          for k:=sep[2]+1 to sep[3]-1 do
  54.          begin
  55.               nomjou:=nomjou+ligne[k];
  56.          end;
  57.          for k:=sep[3]+1 to sep[4]-1 do
  58.          begin
  59.               prenom:=prenom+ligne[k];
  60.          end;
  61.          for k:=sep[4]+1 to sep[5]-1 do
  62.          begin
  63.               clt:=clt+ligne[k];
  64.          end;
  65.          for k:=sep[5]+1 to l do
  66.          begin
  67.               affi:=affi+ligne[k];
  68.          end;
  69.          {mise à blanc de mes variables  }
  70.          for k:=1 to 5 do sep[k]:=0;
  71.          x:=0;
  72.          nclub:='';nomjou:='';prenom:='';lf:='';prenom:='' ;clt:='';affi:='';
  73.      end;
  74.    
  75.      close(f);
  76. end.


 
J'ai constaté que mon programme ne marchait pas en affichant les valeurs des 6 variables et l'instruction 'ch:=readkey'
 
Est-ce peut-être la conversion de mon fichier Excel en fichier text qui est erronée? J'ai sauvé le fichier Excel par "Sauver sous "
 
J'espère avoir été clair et que je pourrais vous lire bientôt sur le forum
 
A bintôt donc et merci
 
Rogerone

zeb
Profil : Modérateur libre
Plus d'informations

Pas mal de code mort.  
Ex: Lignes 28,29, 2 x reset ! z ? bl ?
(Pleins d'essais ?? ;) )
 
Bon, tu as oublié de réinitialiser y !!!!!
 
Ca donne :  

Code :
  1. Program joueursH;
  2. uses dos,crt,printer;
  3. const
  4.      ecran=$b800 ;
  5. var
  6.    f:text;
  7.    ligne:string;
  8.    j,k,y:integer;
  9.    clt:string;
  10.    nomjou:string;
  11.    prenom:string;
  12.    affi:string;
  13.    lf:string; 
  14.    nclub:string;
  15.    sep:array[1..40] of byte;     
  16. begin
  17.      clrscr;
  18.      assign(f,'e:\tennis\advers.txt'); {ouverture du fichier texte }
  19.      {$i-} reset(f); {$i+}
  20.  
  21.      while not eof(f) do
  22.      {je lis l'entiereté du fichier (je ne pourrais accéder à une 4èmè ligne qu'en lisant les 4 premières et en exploitant la dernière et c'est là que cela ne va plus }
  23.      begin
  24.          { Init ici !!! }
  25.          { mise à blanc de mes variables }
  26.          for k:=1 to 5 do sep[k]:=0;
  27.          readln(f,ligne);       
  28.          y := 0; { <-- Init !!! }
  29.          for j:=1 to length(ligne) do {je détermine les positions du caractère chr(9) qui sépare mes variables à trouver}
  30.          begin
  31.               if (ligne[j])=chr(9) then
  32.               begin
  33.                    y:=y+1;
  34.                    if y > 40 then begin
  35.                        writeln ( 'ET LA GESTION DES ERREURS NOM D'UN ORDI EN BOIS !' );
  36.                        halt ( 0 );
  37.                    end;                     
  38.                    sep[y]:=j; { <-- x devient j !!! }
  39.               end;
  40.          end;
  41.          nclub := ''; { <-- Init ici }
  42.          for k:= 1 to sep[1]-1 do
  43.          {je lis les lignes caractères par caractères pour obtenir la valeur de mes variables ceci marche pour la première ligne mais pas pour les autres                                           }
  44.          begin
  45.               nclub:=nclub+ligne[k] ;
  46.          end;
  47.          lf := '';
  48.          for k:= sep[1]+1 to sep[2]-1 do
  49.          begin
  50.                lf:=lf+ligne[k] ;
  51.          end;
  52.          nomjou := ''; { <-- Init ici }
  53.          for k:=sep[2]+1 to sep[3]-1 do
  54.          begin
  55.               nomjou:=nomjou+ligne[k];
  56.          end;
  57.          prenom := ''; { <-- Init ici }
  58.          for k:=sep[3]+1 to sep[4]-1 do
  59.          begin
  60.               prenom:=prenom+ligne[k];
  61.          end;
  62.        
  63.          clt := ''; { <-- Init ici }
  64.          for k:=sep[4]+1 to sep[5]-1 do
  65.          begin
  66.               clt:=clt+ligne[k];
  67.          end;
  68.      affi := '';
  69.          for k:=sep[5]+1 to l do
  70.          begin
  71.               affi:=affi+ligne[k];
  72.          end;
  73.      end;
  74.  
  75.      close(f);
  76. end.


 
Mais ce n'est vraiment pas beau comme code. Et si tu découvrais les fonctions POS et COPY !
 
Exemple à étudier :

Code :
  1. procedure LireFichier(const filename: String);
  2. const
  3.     SEP = #9;
  4. var
  5.     f : TextFile;
  6.     s : String;
  7.     p, q : Integer;   
  8. begin
  9.     assign(f, filename);
  10.     {$i-} reset(f); {$i+}
  11.    
  12.     while not eof(f) do
  13.     begin
  14.         readln(f, s);
  15.        
  16.         p := 1;       
  17.         while true do
  18.         begin
  19.             q := pos(SEP, copy(s, p, length(s) - p + 1));
  20.             if q = 0 then
  21.             begin
  22.                 writeln(copy(s, p, length(s) - p + 1));
  23.                 break;
  24.             end;       
  25.             writeln(copy(s, p, q - 1));
  26.             p := q + 1;
  27.         end;
  28.     end;   
  29.     closefile(f);
  30. end;


 


---------------
Règlement du forum / Règlement de Programmation / Règlement du Monde de Linux euh, n'y en a pas...
Plus d'informations

Merci à "Zeb" pour cette leçon de programmation.
Je connaissais évidemment ces fonctions mais j'ai cherché sans doute la facilité plutôt que l'efficacité.
 
Car ton programme me donne les résultats que j'attendais.
Je l'ai étudié comme tu me le demandais et retiendrai ta leçon pour d'autres applications.
 
Mais si tu as encore le temps  ,tu pourrais me renseigner où mon programme "foire" .Le nombre important d'essais tient au fait que j'essayais de voir où le programme ne donnait plus les résultats satisfaisants.C'était un programme d'essai car maintenant j'adopte le tien!
 
Merci encore
 
 
Rogerone

zeb
Profil : Modérateur libre
Plus d'informations

Comme indiqué plus haut, tu ne réinitialisais y.
Enjoy!


Aller à :
Ajouter une réponse
  FORUM Tom's Hardware » Programmation » Delphi / Pascal » lecture d'un fichier texte
 

Annonces Google
Publicité