astrosug44
Messages postés29Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention 3 février 2007
-
27 avril 2006 à 19:12
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 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...
bv94
Messages postés40Date d'inscriptiondimanche 2 février 2003StatutMembreDernière intervention16 décembre 20061 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;
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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;
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;
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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.
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;