RECUPERATION D'UNE CHAINE APRES RECHERCHE DE MOT

Résolu
didou2dek Messages postés 45 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 16 avril 2015 - 20 sept. 2008 à 15:35
didou2dek Messages postés 45 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 16 avril 2015 - 22 sept. 2008 à 11:37
bonjour j'utilise un fichier TXT que je rafraichis avec des writeln() TXT, cependant je voudrais recuperer toutes les lignes qui se trouvent apres une certaine valeur. ex : voici un bout de mon fichier

[PROJETS]
-----------------------------------------------
EPI ÉPILATION
POS POSE COMPLETE 10 DOIGTS
REM REMPLISSAGE
[PLANNING]
20080830 1000 1020 EPI 0 didier
20080830 1030 1200 POS 2 stef
20080917 1400 1530 POS 0 martine
20080917 1530 1550 EPI 0 x
20080917 0900 1000 REM 0 y

en fait je veux récupérer et afficher dans un memo tout ce qui se trouve apres [PLANNING] pour pouvoir le trier par la suite.
merci par avance pour votre aide

8 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 sept. 2008 à 22:20
@Cantador :
j'ai eu du mal a comprendre ton message ^^

@didou :

Bonsoir,
héhé oui une grosse boulette :

function GetEveryThingAfter(AfterWhat: String; var TextFile: TStringList): String;
var
I: Integer;
Tmp: Integer;
STR: String;
begin
STR := '';
Tmp := Pos(AfterWhat, TextFile.Text) + Length(AfterWhat);
Result := Copy(TextFile.Text, Tmp, Length(TextFile.Text) - Tmp);
end;

Voilà la version corrigée.
Petite erreur d'inattention dans Copy (je mettais comme chaîne paramètre une chaîne vide ...)

Et j'ai testé cette fois, ça renvoie bien tout, mais avec un retour chariot juste avant (un Memo.Lines.Delete(0) fera l'affaire).

Voilà.

Cordialement, Bacterius !
3
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
20 sept. 2008 à 16:41
Récupérer tout ce qui est après [PLANNING] ?

Alors en utilisant TStringList (pour un fichier texte)

function GetEveryThingAfter(AfterWhat: String; var TextFile: TStringList): String;
var
I: Integer;
Tmp: Integer;
S: String;
begin
S := '';
Tmp := Pos(AfterWhat, TextFile.Text) + Length(AfterWhat);
Result := Copy(S, Tmp, Length(TextFile.Text);
end;

Et voilà !

Principe : la fonction récupère le point de départ juste après le mot que tu cherches
Ici, pour [Planning], il va d'abord trouver la position du premier "[".

Ensuite on ajoute à cette position la taille du mot

Ce qui fait qu'on arrive à [ + 1, soit le "2".

A partir de là, on copie dans le résultat tout (du 2 jusqu'à la fin du texte).

Et voilà !

Pour l'appeler :

TonTexteATraiter := GetEveryThingAfter('[PLANNING]', TonStringList);

Bonne continuation.

Cordialement, Bacterius !

PS : je n'ai pas testé, il peut y avoir quelques bugs (le 2 non compris, un petit dépassement ... je compte sur toi pour arranger tout cela).
0
didou2dek Messages postés 45 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 16 avril 2015
21 sept. 2008 à 00:49
merci pour ton aide mais ma procedure ne fonctionne pas regarde si j'ai bon et sois indulgent c'est pas évident pour moi je m'y mets doucement mais ça me plait beaucoup. voila ce que j'ai codé pour utiliser ta fonction
procedure TForm1.Button3Click(Sender: TObject);
var contents : tstringlist;
svar : string;
i : integer;
begin
contents:=tstringlist.Create;
contents.LoadFromFile('c:\planning.txt');
for i:=0 to contents.Count-1 do
begin
svar:=GetEveryThingAfter('[PLANNING]', contents);
memo1.Lines.Add(svar);
exit;
end;
au clic du btn rien ne se passe ?
0
Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
21 sept. 2008 à 10:13
Bonjour,
laisse tomber ta boucle, ma fonction s'occupe de tout.
Et n'oublie pas de libérer Contents.

procedure TForm1.Button3Click(Sender: TObject);
var
Contents: TStringList;
SVar: String;
begin
Contents := TStringList.Create; // Tu crée ta liste
try
if FileExists('C:\Planning.txt') then // Si ton fichier existe alors ...
Contents.LoadFromFile('C:\Planning.txt'); // Tu ouvres la liste
SVar := GetEveryThingAfter('[PLANNING]', Contents); // Tu isoles tout après
Memo1.Lines.Clear; // On vide avant
Memo1.Lines.Text := SVar; // Tu obtiens le tout sous forme de chaîne chariot
finally
Contents.Free; // Tu libères ta liste
end;
end;

Le try..finally permet de garantir que ta liste sera libérée quoi qu'il arrive.
Ca devrait marcher ce coup-ci ;)

Cordialement, Bacterius !
0

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

Posez votre question
didou2dek Messages postés 45 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 16 avril 2015
21 sept. 2008 à 19:30
Bonsoir, merci de nouveau de m'avoir répondu rapidement mais es tu sur que ta fonction est ok car je viens de tout relancer avec la procédure que tu m'as corrigé mais rien ne se passe le memo reste vide, j'ai essayé de suivre les étapes avec des showmessage mais idem le showmessage reste vide sur la variable Svar ?

Merci
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 sept. 2008 à 19:42
@bacterius :
   S ?

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
22 sept. 2008 à 09:47
j'ai eu du mal a comprendre ton message ^^



Oui, c'est vrai j'ai fait un peu court..
mais, l'info est passée quand même...

cantador
0
didou2dek Messages postés 45 Date d'inscription lundi 9 septembre 2002 Statut Membre Dernière intervention 16 avril 2015
22 sept. 2008 à 11:37
Merci à toi Bacterius, heureusement qu'il y a des gens comme vous sur ce forum pour faire avancer les choses.

Cordialement , Didou
0
Rejoignez-nous