Read de real dans un fichier .txt et excel2000.pas

Résolu
cs_groben Messages postés 11 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 22 novembre 2005 - 17 nov. 2005 à 15:55
cs_groben Messages postés 11 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 22 novembre 2005 - 22 nov. 2005 à 16:13
Bnjour,
Je génère un fichier .txt avec des valeurs reelles séparées par des tabulations,
ailleurs dans le programme, je réouvre le fichier,
Je voiudrais récupérer les données mais la fonction


read(f_txt, un_real); me donne l'erreur
'saisie numérique incorrecte." avec un réel ou bien un double.


les 2 premières lignes du fichier sont :
1,40625 -7,03125 -0,703125
2,8125 -9,140625 -2,109375


J'ai essayé d'une autre manière... mais g eu d'autres pb :



while(not seekof(f_csv);
readln(f_csv, buffer);
lestring :='';
str_angle :='';
str_min :='';
str_max :='';
str_moy :='';
j :=1; // on n'est pas en C/C++, pas de i =0 !!!


while j<length(buffer)do
begin
lestring :='';
while (buffer[j]<>#9) do
begin
lestring := lestring + buffer[j]; // -5,169 -> 961,5- !!!!!!!!
j:=j+1;
end;
lestring := virgToPoint(lestring);


for k:=length(lestring) downto 1 do
begin
str_angle := str_angle + lestring[k]
end;
XL.cells[i, 21].value :=str_angle; //on va prendre les colonnes 21,22,23


if( buffer[j] = #9 ) then j:=j+1;
lestring :='';
if( buffer[j] = #9 ) then j:=j+1;
while (buffer[j]<>#9) do
begin
lestring := lestring + buffer[j];
j:=j+1;
end;
lestring := virgToPoint(lestring);


for k:=length(lestring) downto 1 do
begin
str_min := str_min + lestring[k]
end;
XL.cells[i, 22].value :=str_min; //on va prendre les colonnes 21,22,23


if( buffer[j] = #9 ) then j:=j+1;
lestring :='';
if( buffer[j] = #9 ) then j:=j+1;
while (buffer[j]<>#9) do
begin
lestring := lestring + buffer[j];
j:=j+1;
end;
lestring := virgToPoint(lestring);


for k:=length(lestring) downto 1 do
begin
str_max := str_max + lestring[k]
end;
XL.cells[i, 23].value :=str_max; //on va prendre les colonnes 21,22,23
j:=j+1;
i:=i+1;
end;
XL.cells[i, 21].value := XL.cells[i-1, 21].value + 0.17578125; //feinte du chacal
XL.cells[i, 22].value := str_max; //pour ne faire qu'une courbe !


i:=i+1;
end;



pb :
d'abord, ça marche bien mais :
1) g une inversion des chiffres : -5,169 -> 961,5- (je l'ai réglée)
2) c vachement lourd, vu ke g 1024 lignes à lire... y'en a pour 20 secondes mini !


PS :
Je n'ai ke Delphi 2.0 alors pas la peine de me proposer des super fonctions ki ne fonctionnent k'à partir de Delphi5.1 (la boite où je suis en stage ne peut se le permettre)
D'ailleurs, si vous savez où récupérer Excel2000.pas & la DLL qui va avec...je suis preneur (g encore des graphiques à faire, de l'impression..)
PPS : comment connaitre les procédures que je peux utiliser pour Excel avec ma version de Delphi? (XL.cells[] marche, mais pas XL.range[]...)

merci

4 réponses

cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
21 nov. 2005 à 07:58
Salut,



Les fontion Read(ln) et Write(ln) sont des fontions du Pascal "de base" qui
n'utilisent que le caractère '.' comme

séparateur décimal.



Elle ont pourtant un intérêt certain puisque dans ton cas et (si le séparateur était un point) tu pourrais écrire


readln(f_txt, x1, x2, x3)



Ken@vo

<hr size="2" width="100%">Code, Code, Codec !

[%3C/body ]
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
18 nov. 2005 à 10:56
bien bien quel courage!





mais je propose une alternative plus simple :



stoke tes nombres les uns aprés les autres dans ton fichier texte :



0,123

0,456

0,789



ect...



si les chiffres font partis d'un ensemble de 3 par exemple, fait comme ça :



0,123:0,456:0,789



separe avec des ":" ou "|" ou "/" sincerement je n'aime pas
l'utilisation de TAB (#09) pour separer des valeurs car certains
editeur de texte remplace les tabulations par des espaces (#32) de plus
TAB est un caractere non visible.



ensuite donc, pour recuperer ton fichier texte, plusieur moyen : la
TStringList (logiquement dispo sur Delphi 2.0) au pire prend une
listbox ou un memo avec propriété visible a false...



var TMP : TStringList;

begin

TMP := TStringList.Create;

TMP.LoadFormFile('fichier.txt');

/// traitement ///

TMP.Free;

end;



tout simplement.



pour recuperer une ligne, il suffit de lire la propriétée Strings de TMP :



TMP.Strings[0];



pour la premiere ligne.



grace a la proprietée Count, tu peu connaitre le nombre de ligne presente dans TMP.

attention Count vas de 1 a X alors que Strings vas de 0 a Count-1 ... logique.



ensuite pour recuperer tes chiffres une simple fonction :



function GetChiffre(const SC : string; const position : integer) : single;

var p1,p2 : integer;

const delimit : char = #9;

begin

case position of

1 : begin p1 := 1; p2 := pos(delimit,SC)-1; end;

2 : begin p1 := pos(delimit,SC)+1; p2 := pos(delimit,SC)-1; end;

3 : begin p1 := pos(delimit,SC)+1; p1 := posex(delimit,SC,p1)+1; p2 := length(SC); end;

end;

result := StrToFloatDef(copy(SC,p1,p2), 0.0);

end;



fonction a debugé et a amelioré selon les besoin.



utilisation :



PremierChiffre := GetChiffre( TMP.Strings[0], 1);

DeuxiemeChiffre := GetChiffre( TMP.Strings[0], 2);

TroisiemeChiffre := GetChiffre( TMP.Strings[0], 3);



note que StrToFloatDef permet d'eviter les erreur de convertion chaine vers réel avec valeur par defaut a 0.0 dans mon exemple.



unitée requise :



StrUtils pour Posex (ne semble pas exister sous D2)

Classes pour TStringList

SysUtils pour StrToFloatDef (ne semble pas exister sous D2)



au passage, ce serait bien d'evoluer un peu en passant a une version superieure de delphi... la 5, 6 ou 7 par exemple.

y'a quand meme eu pas mal d'evolution depuis ...



autre chose, pour eviter ce genre de truc :

j:=j+1;

fait plutot

inc(j);



et dans le cas contraire :

j := j -1;

fait

dec(j);





voila comment ce la devrais se presenter au final (pouf je ressort ma ref Delphi 2 au passage) :



procedure TForm1.Button1.click(Sender : TObject);

function GetChiffre(const SC : string; const position : integer) : real;


var p1,p2 : integer;


const delimit : char = #9;


begin


case position of


1 : begin p1 := 1; p2 := pos(delimit,SC)-1; end;


2 : begin p1 := pos(delimit,SC)+1; p2 := pos(delimit,SC)-1; end;

3 : begin p1 :=
pos(delimit,SC)+1; p1 := pos(delimit,copy(SC,p1,length(SC))+1; p2 :=
length(SC); end;


end;


result := StrToFloat(copy(SC,p1,p2));

end;

var

j,i : integer;

tmp : tstringlist;

str_angle,

str_min,

str_max : real;

begin

tmp := tstringlist.create;

tmp.loadfromfile('fichier.txt');

i := 0;

for j := 0 to tmp.count-1 do begin

XL.cells[i, 21].value := GetChiffre(tmp.string[j],1);

XL.cells[i, 22].value := GetChiffre(tmp.string[j],2);

XL.cells[i, 23].value := GetChiffre(tmp.string[j],3);

inc(i);

XL.cells[i, 21].value := XL.cells[i-1, 21].value + 0.17578125;

XL.cells[i, 22].value := XL.cells[i-1, 23].value;

end;

tmp.free;

end;



logiquement ... ça doit marcher ... j'ai bien verifier avec la ref D2 pour la compatibilitée...
0
cs_groben Messages postés 11 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 22 novembre 2005
18 nov. 2005 à 14:50
Merci pour tout, ton explication est très détaillée,
je pense pouvoir m'en sortir avec ça, mais je suis en WE et je testerai tout ça lundi.
l'entreprise n'est pas du tout spécialisée en info, mais a besoin de qqs petits programmes...

& à propos de l'utilisation de Excel, avec le fichier .pas & le DLL, y'en a qui ont des idées?

bonne prog.
BEN
0
cs_groben Messages postés 11 Date d'inscription lundi 20 novembre 2000 Statut Membre Dernière intervention 22 novembre 2005
22 nov. 2005 à 16:13
Tout simplement.........
mon problème venait des virgules !!!
pourtant, j'utilise floatToStr(undouble) pour écrire dans le fichier, il me met une virgule & ne peut pas la lire??
j'ai un peu de mal à saisir ces subtilités ;-)

Merci [mailto:Ken@vo Ken@vo], le Breizh power est en toi ! (c un brestois d'adoption ki te le dit : D )
0
Rejoignez-nous