Lire sous chaine puis sous chaine...au fur et à mesure

Lire sous chaine puis sous chaine...au fur et à mesure - Delphi/Pascal - Programmation

Marsh Posté le 23-04-2006 à 01:19:09    

Salut à tous   :hello:  
 
je suis hyper debutant en programmation/delphi et je cherche à lire dans une chaine mais en découpant celle-ci (pour aller dans un StringGrid "à therme" ), en fait c'est une seule et meme grosse chaine, un fichier.txt qui stocke plein de paramètres à la suite comme celui-ci (j'ai mis des retours chariot pour plus de lisibilité mais à la base tout est à la suite):
 
:SAT "Hotbird" 13.0 E
:NET " " 176
:TRP 12000 1091000 275000 176 V 1 3/4
:CHN "TF1" 1604 T
:CHN "M6" 1601 T
:CHN "TF6" 1607 T
:TRP 11600 1083400 275000 176 V 1 3/4
:CHN "FRANCE 2" 1103 T
:TRP 11800 1087200 275000 176 V 1 3/4
:CHN "FRANCE 4" 1505 T
:NET " " 318
:TRP 15600 1162328 275000 318 V 1 3/4
:CHN "ARTE" 10703 T
:SAT "Astra" 19.2 E
:NET " " 1
:TRP 1116 1266950 220000 1 V 1 5/6
:CHN "VIVA" 12732 T
:TRP 1108 1255150 220000 1 V 1 5/6
:CHN "VIVA PLUS" 12120 T
:END
 
c'est un fichier qui contient une liste de chaine d'un démodulateur satéllite, il a donc plein de paramètres en découpant ça ferait:
 
satéllite: ""Hotbird" 13.0 E"
network: "" " 176" ou "176"
transpondeur: "1091000"
etc... jusqu'à :END
 
mais comment lire par ex. ""Hotbird" 13.0 E" et le mettre dans une variable (ou StringGrid directement)  puis "176"->variable puis "1091000"->variable etc...
 
on peut faire un readln et mettre tout (et encore...) dans une variable mais après? vu la longueur que ça peut prendre...
 
ne peut on pas lire un truc du genre:
 
if Pos (Uppercase(":SAT" ), Uppercase(Tmp))> 0 then
-je sais pas koi-
mettre ""Hotbird" 13.0 E" dans StringGrid
puis -je sais pas koi-
mettre "176" dans StringGrid
etc...
???
 
j'ai beau chercher un peu partout, je voit pas koi faire  :sweat:  
 
 
Merci à celui qui pourait éclairer ma lanterne meme en donnant de simples diréctives, j'suis pas fénéant non plus mais si ça aboutit pas...  :)


Message édité par Flagad'aware le 17-06-2006 à 11:59:05
Reply

Marsh Posté le 23-04-2006 à 01:19:09   

Reply

Marsh Posté le 24-04-2006 à 11:20:11    

Pour extraire une partie donnée d'un cheine, c'est la foonction copy.exmple:  

MaChaine := copy ('je suis un ours en peluche',2,5);


Dans ce cas, MaChaine vaudra "e sui"
 
Pour remplir un StingGrid, tu fait:

MonStringGrid.cell[x,y] := MaChaine;


Pour lire :  

MaChaine := MonStringGrid.cell[x,y];


Regarde aussi l'aide de TStringList. C'est souvent une bonne facon de stocker des chaines.
 
....et bon courage   [:gijar]


Message édité par el zozo le 24-04-2006 à 11:20:50
Reply

Marsh Posté le 25-04-2006 à 01:58:07    

Merci pour cet exemple de Copy je crois que ça va m'être très utile  :)  
 
mais là ça résoud pas tout, le problème c'est que mon fichier texte est une seule grosse chaine de caractères, l'exemple que j'ai mis avant c'est une toute petite liste de chaines (de 8 chaines de télé) ce serait encore possible de faire un copy en comptant le nombre de caractères mais ces fichiers peuvent être énorme et comporter plus de 1000 chaines on ne peut donc deviner le copy à faire sur un :SAT ou un :TRP qui serait dans 500 caractères, je pense que tu voit ce que je veut dire.
 
y faut (à mon avis) que je fasse une boucle qui englobe tout en lisant la chaine au fur et à mesure, d'ailleurs ce que je mettait ne peut surement pas aller:
 

if Pos (Uppercase(":SAT" ), Uppercase(Tmp))> 0 then
...


 
déja ":SAT" il pourrait le voir 200 fois dans cette grande chaine et en plus on peut rien faire avec Tmp si c'est toute la chaine qui est dedans (donc le fichier.txt)
 
en schematisant il faudrait par ex pour:
 
-debut txt-
:SAT HB :TRP 12000 1091000 275000 176 V 1 3/4 :CHN "TF1" 1604 T :END
-fin du txt-
 
 
une procédure du genre (c plein de c*nneries mais c juste pour l'exemple):
 
 while not Eof ou ":END"
 
  if ":SAT" then  Stringgrid :=copy (':SAT HB' ,6,2) // pour mettre HB
 
et depuis cette position
 
 if  ":TRP" then Stringgrid :=copy (':TRP 12000 1091000 275000 176 V 1 3/4' ,6,5) // pour 12000
 Stringgrid :=copy (':TRP 12000 1091000 275000 176 V 1 3/4' ,12,7) // pour 1091000
 
etc jusqu'à :END
 
après pour mettre dans le Stringgrid ou Stringlist je me débrouillerais facilement pour les copy pareil la boucle certainement aussi , mais comment lire; je sais pas si on peut dire; séquentièlement dans une meme chaine?
 
n'y a-t-il aucun moyen d'avancer au fur et à mesure ou de mémoriser la position en cours dans la chaine?
 
 

Reply

Marsh Posté le 25-04-2006 à 09:13:25    

Et si tu fais un RightStr(Chaine,Length(Chaine)-5) ?
 
Le 5 correspondant à tes 4 premiers caracs + l'espace

Reply

Marsh Posté le 25-04-2006 à 13:04:23    

bien pratique aussi mais, je viens d'essayer, ça me donne toute la chaine sauf les 4 premiers :-/
 
dans le pire des cas, soit je fait un tri avec LeftStr puis RightStr comme ça:  
 

if Pos (Uppercase(':SAT'), Uppercase(Tmp))> 0 then
   begin
 TriD := LeftStr(Tmp,Length(Tmp)-X) ;
 TriG := RightStr(TriD,Length(TriD)-6);


 
et dans TriG ça roule
 
mais X est indéterminé et pas evident à compter du fait que chaque "section" comme :CHN ou :TRP peut varier
 
ou alors je trouve un moyen de copier chaque "section" et en créant un deuxième fichier txt, de mettre un retour chariot à chaque "section", là je pourrait utiliser Copy mais ces section peuvent toujours varier quoi que tout ne varie pas


Message édité par Flagad'aware le 25-04-2006 à 13:04:59
Reply

Marsh Posté le 26-04-2006 à 10:15:54    

Bah j'avais compris que cétait ce que tu voulais.
Je pensais que tu avais crée un modèle de longueur de début de chaîne et donc tu voulais toujours récupérer les fins de lignes, hormis les variables...
 
Et je viens juste de relire que tout est à la suite... ;)
 
Dans ce cas tu peux faire :
 

Citation :


procedure TForm1.Button1Click(Sender: TObject);
Var Fini : boolean;
  TempVal,Chaine : widestring;
 
begin
 
Fini := False;
Chaine := Edit1.Text;
 
While not Fini = true Do
begin
If Leftstr(Chaine,4) = ':SAT' then
TempVal := 'Sattelite';
If Leftstr(Chaine,4) = ':NET' then
TempVal := 'Network';
If Leftstr(Chaine,4) = ':TRP' then
TempVal := 'Transpondeur';
 
If Leftstr(Chaine,4) = ':END' then
Fini := True;
 
if Fini = false then
begin
  Chaine := rightStr(Chaine,length(Chaine)-5);
  Memo1.Lines.Add(TempVal + LeftStr(Chaine,Pos(':',Chaine)-1));
  Chaine := RightStr(Chaine,length(Chaine)-(Pos(':',Chaine)-1));
end;
 
end;
 
end;


 
C'est un peu lourd mais ça marche !

Reply

Marsh Posté le 26-04-2006 à 20:54:49    

Ouaooooooooo Merci beaucoup, ça maaarche!  :bounce:  
 
j'ai pas encore tout capté comment mais effectivement ça marche nickel, meme en mettant le fichier txt complet dans une variable de type Widestring
 
en modifant le debut:
 

----
AssignFile(FichierTest, 'test.txt');
  Count := 0     ;
  Reset(FichierTest);
  Readln(FichierTest, Tmp);
  Chaine := Tmp;
  CloseFile(FichierTest);
  Fini := False;
----


 
j'aurais jamais pensé qu'on pouvait ce permettre de rentrer une chaine aussi longue dans une variable widestring, apparement c limité à 2Go par Delphi enfin surtout la ram dispo...de toutes façons le jour où j'aurais un txt de rien que 500Ko il est pas arrivé  :D
 
effectivement c'est peut être un peu bourrin pour des mecs comme toi qui maîtrise mais à mon niveau c'est plutôt "une bonne solution"  [:athlonxp2100+]
 
j'avait trouvé un moyen de localiser les :SAT, :TRP etc avec AnsiPos:
 
 

Tri1 := AnsiPos(':SAT', Tmp);
  Tri2 := AnsiPos(':NET',Tmp);
  Tri3 := AnsiPos(':TRP',Tmp);
  Tri4 := AnsiPos(':CHN',Tmp);
  showmessage ( inttostr(Tri1)+ ' ' + inttostr(Tri2)+
  ' '+ inttostr(Tri3)+ ' ' + inttostr(Tri4) );


 
malheureusement meme en bouclant il ne reprenait jamais au prochain ":CHN" par ex.
 
l'avantage de la variable c'est qu'on peut la "nettoyer" de ce qu'on vient de lire, ce que tu m'a montré, si j'ai bien compris, juste avant le premier end;
 
Encore en un grand merci de m'avoir débloqué, je commençait à m'arracher les cheveux (doucement quand meme), ptaint quand on est newbie ça fout les boules la programmation, vous devez être de vrais moines Tibétains vous les coder  :D
 
 :jap:  :jap:  :jap:  
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed