cs_groben
Messages postés11Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention22 novembre 2005
-
17 nov. 2005 à 15:55
cs_groben
Messages postés11Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention22 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[]...)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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;
cs_groben
Messages postés11Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention22 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?
cs_groben
Messages postés11Date d'inscriptionlundi 20 novembre 2000StatutMembreDernière intervention22 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 )