Lecture dans un fichier Typé

Résolu
astrosug44 Messages postés 29 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 3 février 2007 - 27 avril 2006 à 19:12
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 1 mai 2006 à 18:18
Bonjour,
Je voudrait savoir comment faire pour récupérer des donnés dans un fichier typé....
Par exemple voila ce qu'il y aurait dans "exemple.txt" :

12.45432;45.5664;-1
04.02111;47.0943;1

Comment faire pour récuperer la valeur 12.45432 puis 45.5664 etc....
Je connais les fonctions readLn et WriteLn  Mais elle récupere toute la ligne alors que moi je voudrais récuperer que la valeur jusqu'au point virgule...

Merci d'avance,
Guillaume

6 réponses

bv94 Messages postés 40 Date d'inscription dimanche 2 février 2003 Statut Membre Dernière intervention 16 décembre 2006 1
27 avril 2006 à 19:33
Bonjour,


par exemple :

Function Tform1.lirefic(ligne,id:integer):string;
var
   temp : string;
   i : integer;
begin
   with tstringlist.create do
   begin
     loadfromfile('mon_fichier');
     temp := strings[i];
     while (i0) do
        system.delete(temp,1,pos(';',temp));
     if pos(';',temp)>0 then
        result := LeftStr(temp,pos(';',temp)-1)
     else
        result := 'Erreur';
     free;
   end;
end;

A condition que ta chaine finisse par ';' !...

A ton service.

BV94
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 avril 2006 à 19:37
Tu récupere ta ligne et tu utilise la fonction ExtractText ci-dessous

AssignFile(fichier, 'ton fichier');
Reset(fichier)
readln(Fichier,LigneLu);
  ExtractText(';', 0); // La tu récupere la chaine '12.45432' que tu convertira
  ExtractText(';', 1); // 45.5664
  ExtractText(';', 2); //-1
closefile(fichier)

function ExtractText(s: string;substr: string;n:integer): string;
var
  i:integer;
begin
  S:= S+substr;
  for i: =1 to n do
  begin
    S:= copy(s,pos(substr,s)+length(substr),length(s)-pos(substr,s)+length(substr));
  end ;
  result: =copy(s,1,pos(substr,s)-1);
end;
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
27 avril 2006 à 23:03
voir la fonction ChainePos qu'on a elaboré sur delphifr :

s'utilise comme ceci :

T1 := ChainePos(';',S,1);
T2 := ChainePos(';',S,2);

avec de superbe performances meme si on en abuse.
parce que la fonction que donne Pingu, meme si bonne sur le plan du code, afficheras des performances execrable sur les longues chaines et nombreux appels.

function ChainePos(const Sep, Dans: String; const posi: cardinal = 1): String;
   {+e_PosEx}
   { Déclaration PosEX (on la renome e_PosEx pour eviter tout conflit en cas de declaration de StrUtils) }
   function e_PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
   { renvoi la position d'une sous-chaine Substr dans une chaine S à partir de la position Offset }
   var I, X, Len, LenSubStr: Integer;
   begin
     if Offset = 1 then
        Result := Pos(SubStr,S)
     else begin
        I := Offset; LenSubStr := Length(SubStr);
        Len := Length(S)-LenSubStr+1;
        while I <= Len do begin
           if S[I] = SubStr[1] then begin
              X := 1;
              while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do Inc(X);
              if X = LenSubStr then begin
                 Result := I;
                 exit;
              end;
           end;
           Inc(I);
        end;
        Result := 0;
     end;
   end;
   {-e_PosEx}

var I,P1,P2 : integer;
begin
{ initialisation du retour par defaut de la fonction ChainePos }
  Result := '';

{ sortie prématurée avec séparateur en premiere position dans la chaine }
  if (e_posex(Sep,Dans[1]) = 1) and (posi <= 1) then exit;

{ 1ère position de lecture pour la fonction e_posex }
  P1 := 1;
  for I := 1 to Posi-1 do begin
  { recherche position prochain séparateur pour borne à gauche }
      P1 := e_posex(Sep, Dans, P1);
      { sortie prématurée pas de prochain séparateur }
      if P1 = 0 then exit
      { sinon decale la position a position+taille du separateur }
      else P1 := P1 + length(Sep);
  end;

{ Recherche prochain séparateur pour borne à droite }
  P2 := e_posex(Sep, Dans, P1);
  { En cas d'absence, par défaut longueur chaine entrée+1 pour le dernier caractère }
  if P2 = 0 then P2 := length(Dans) + 1;

{ Fin : extraction sous-chaine de position p1, longueur p2-p1 grace a Copy}
  Result := copy(Dans, P1, P2 - P1);
end;
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 avril 2006 à 23:12
Tres interessant. Je vais de ce pas modifier ma fonction par celle-ci. (je vais juste la modifier de facon à ce que 0 soit la 1ere occurence).
Merci f0xi !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
1 mai 2006 à 18:14
non Pingu!

ne modifie pas l'occurence pour la mettre a Zero.
car elle correspond au Premier mots dans la chaine et non au Zerotieme mots!

donc laisse la a 1 vus que 1 = premier mots trouvé
generalement j'utilise cette fonction avec une autre : CountChar qui permet de compter le nombre de separateurs dans la chaine et donc de savoir combien de mots séparés elle contient.

function CountChar(const S : string; const CharToCount : char) : integer;
var N : integer;
begin
  result := 0;
  N      := Posex(CharToCount,S,1);
  while N <> 0 do begin
    inc(result);
    N := Posex(CharToCount,S,N+1);
  end;
end;

donc a supposé que CountChar nous retourne 5 separateurs, ils doit donc y avoir CountChar+1 mots dans la chaine.

de toute façon ChainePos ne renveras rien si l'occurence est superieure au nombres de mots present.
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
1 mai 2006 à 18:18
ah j'oubliais, CountChar ne fonctionne que si on utiliser des separateurs  qui ne font qu'un octet de longeur.
si on utilise des separateurs plus longs, j'utilise ma fonction CountString, qui elle compte le nombre d'occurence de chaine dans la chaine.

function CountString(const S : string; const StrToCount : string) : integer;
var N : integer;
begin
  result := 0;
  N      := Posex(StrToCount,S,1);
  while N <> 0 do begin
    inc(result);
    N := Posex(StrToCount,S,N+Length(StrToCount));
  end;
end;
0
Rejoignez-nous