Manipuler le texte d'une string!

ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008 - 25 mars 2008 à 20:39
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008 - 29 mars 2008 à 07:40
Cher Membres Delphifr,

J'aimerais effectué deux opérations bien simple...

voici mon texte example qui est contenu dans la string X

1234
texte non-fixe, aleatoire
philipe = "x"
martin = "y"
alain = "z"
autre texte imaginaire

la string peut etre tres longue et peu contenir entre 1k et 600k de texte donc jai penser pour recuperer les donnes philipe,martin et alain
soustraire toute le texte avant philipe et apres alain .. donc la string serais alors plus petite pour rechercher le texte plus rapidement...

pour ensuite recuperer le texte entre philipe = " et " meme chose pour martin et alain...

Ce qui me resume a vous poser deux simple questions

1. comment soustraire du texte avant et apres , un mot X et Y
2. comment extraire [emphase] efficacement et rapidement /emphase entre X = " et "

wiwi jai regarder des example de parser mais hmmm il doit i avoir plus simple., comme rester avec les trucs de delphi comme POS, set length etc etc
Et pour le regex oublier sa, c'est trop lent j'ai assayer

PS: Les ordis de mes clients n'ont pas tous des bombes comme ordinateur , donc ceci est un facteur a tenir compte.

Merci beaucoup de votre aide !

Laurent

11 réponses

ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
25 mars 2008 à 23:27
ReBonjour ... un petit update...

pour ce qui est de trimmer la string jai trouver ceci...

function entre(strav : string;strap : string;source : string) : string;
begin
entre := avant(strap,apres(strav,source))   ;
end;

function avant(str : string;source : string) : string;
var
n : integer;
begin
n := pos(str,source);
avant := copy(source,1,n - 1);
end;

function apres(str : string;source : string) : string;
var
n : integer;
begin
n := pos(str,source);
apres := copy(source,n + length(str),length(source));
end;

Es-ce que je suis dans la bonne voie ?

C'est le moyen le plus rapide ?

Merci a toi , cher membre

Laurent
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
26 mars 2008 à 15:05
Salut,

"Es-ce que je suis dans la bonne voie ?"

oui. c'est une voie.

"C'est le moyen le plus rapide ?" j'en doute. étudie un peu ton string. peut-être que tu peux utiliser posEx().

aussi, si tu veux "juste" extraire le string du milieux, fait deux pos/posEx puis UN copy. le tout dans la même function. (moins de manip/copy -> plus rapide)

aussi, tu peux faire une lecture incrémentale depuis ton premier Pos(philip). à toi de voir.

pour lire les "nom = valeur" il y a aussi les TStringList.Name / value ou eventuellement les Tinifile.

niveaux vitesse, je crois que les pchar avec test incrémentaux sont les plus rapide. mais cela dépend toujours du context.

voir http://www.prodelphi.de/ (tu peux utiliser la version gratuit dans une applic de test avec juste le bout de code a tester)

bonnes mesures,

Loda

PS: j'assume que tu as vu/lue/tester les codes de manipulation de chaîne de
la frame "
Derniers snippets pour Delphi".

<hr size ="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 mars 2008 à 14:36
"j'assume que tu as vu/lue/tester les codes de manipulation de chaîne de la frame "
Derniers snippets pour Delphi"."

Je dirai que non
 
@+
Cirec

<hr siz="" />
0
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
27 mars 2008 à 19:27
http://www.codyx.org/snippet_extraction-chaine-caracteres-partir-occurence-separator_131.aspx



Si vous parlez de cela... c'est justement ce que je ne veux pas faire

Je m'explique:

Voir fichier texte ici ---> output.txt Dump de la string

je doit extraire que certains valeur entres les "  " dont je connais le nom ... donc je ne peu pas dire que TOUT le valeur entre chaque " " sont importante a recuperer (ce que le snippet , quoi que pratique, de f0xi fait!)....

Autrement, je vois pas autre snippet delphi qui « pourrrais » m'etre utile!

Bonne journee

Laurent
0

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

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 mars 2008 à 20:53
non c'est pas spécialement ce snippet qui était visé (quoi qu'il est très bon)
ils figurent en première page sur DelphiFr dans la rubrique : "
Derniers snippets pour Delphi"

et il n'était dit nulle part qu'il existe une fonction qui fait exactement ce que tu demandes
par contre elles peuvent te mettre sur la bonne voie pour la créer toi même !!!

sinon quelle est la source de cette String ?
c'est toi qui la crée ?

si oui tu te prends la tête pour rien

 
@+
Cirec

<hr siz="" />
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
27 mars 2008 à 21:33
Le pire ... c'est que encore une fois il y avait tout et sous tes yeux :

Le lien se trouve en première page :
http://www.codyx.org/snippet_recuperer-chaine-inconnue-placee-entre-deux-chaines-connues_334.aspx

Implementation

{$R *.dfm}
Uses
StrUtils; {Indispensable pour
PosEx}
Var aStr : String = '1234;texte non-fixe,
aleatoire;philipe "x";martin "y";alain = "z";autre texte imaginaire';

Function MidStr(Const S, SLeft, SRight: String): String;

Var
  PosLeft, PosRight: Integer;

Begin
  PosLeft : = Pos(SLeft, S);

  If PosLeft < 1Then Exit;

  Inc(PosLeft, Length(SLeft));
  PosRight := PosEx(SRight, S, PosLeft);

   If PosRight < 1Then Exit;
  Result
: = Copy(S, PosLeft, PosRight - PosLeft);
End;
 
Procedure
TForm1.Button1Click(Sender: TObject);
Begin
// Attention a respecter la Case   Label1.Caption : MidStr(aStr, 'martin "', '"');
End ;

Pour la case ça peut s'arranger on peut facilement la modifier ...
Mais dans tous les cas un peut de rigueur s'impose. Il faut choisir entre mettre un espace ou non entre le signe = parce que dans ton exemple on y trouve de tout !!!!

Mes précédentes questions restent toute fois d'actualité
 
@+
Cirec

<hr siz="" />
0
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
27 mars 2008 à 23:42
Merci Cirec!

en fait cest du code dun script javascript tirer du site UPS (en fonction du tracking number du colis) dont jai trimmer et garder que lessentiel ... jai virer tout les CR+LF comme tu a pu voir.

Je vais tester ton code ... en meme temps que tu a posté ta reponse jai aussi trouver un code qui marche ... coté performance tu peu me donner ton avis ?

function InStr(Start: integer; Source: string; SourceToFind: string): integer;
begin
Result := pos(SourceToFind,copy(Source,Start,Length(Source) - (Start - 1)));
end;

function obtaintxt(startdel:string;enddel:string;source:string):string;
var
startpos: integer;
begin
startpos :=InStr(Pos(startdel,source)+Length(startdel)+1,source,enddel);
result:= Copy(source,Pos(startdel,source)+Length(startdel),startpos);
end;

donc avec

edit1.text :=  obtaintxt('status = "','"',temp); //temp etant la string contenant le output ups.txt que jtai montrer

jobtien donc delivered dans la string [...] status = "delivered" [...]

Autre question comment fait tu pour calculer la performance dune function vs un autre ?

C-a-d comment calculer combien de cycle cpu prend a executer X function ?
Je sais que c possible , car je developpe pour du embedded et dieu sais que lefficaciter est tres important sur cest platforme la mais cetais sous un debugger en C. Avec delphi aucune idee comment proceder

Salut et a + !

Laurent
0
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
28 mars 2008 à 13:53
re,

dans InStr, si tu connais un offset: utilise posEX
!!!! et non pas un pos(s,copy(...)) !

"Autre question comment fait tu pour calculer la performance dune function vs un autre ?"
voir, par exemple,  http://www.prodelphi.de/ pour mesurer les performances (nb de cycle cpu) de ton prog.

sinon, tu peux faire tourner ton code en boucle 10'000x en utilisant un getTickCount avant et après. c'est pas une vrai mesure, mais ça donne une bonne idée.

"jai virer tout les CR+LF comme tu a pu voir."
pourquoi?? je veux dire: pourquoi perdre du temps (CPU) à virer une partie du string si tu veux juste extraire un sous-string?

bon code,

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
0
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
29 mars 2008 à 07:33
Je vais assayer le truc ProDelphi , sa l'air bien

"jai virer tout les CR+LF comme tu a pu voir."
pourquoi?? je veux dire: pourquoi perdre du temps (CPU) à virer une partie du string si tu veux juste extraire un sous-string?

en fait ... la vrai string de depart cest la page en code html (80k) dont jai garder que lessentiel ... couper avant et apres la section javascript contenant certain variable dont je veut extraire.... ah oui pour les CR+LF cest bien simple.... cest beaucoup plus facile pour moi de localiser du texte en RegEx comme sa

bob, bob2, bob3

que comme sa

bob

bob2

car oui lindentation sur certain site est aussi nul que cela !!!

Jespere avoir satisfait tes questions

Merci Loda de ta réponse,

Laurent
0
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
29 mars 2008 à 07:38
Petite précision : je n’utilise pas de RegEx pour le site UPS , dont le topic
parle. J’utilise la fonction obtaintxt .
C'est sur que même avec les CR+LF sa marcherais, mais comme sa me sort Degas du
code formater pour travailler en RegEx pour les autres sites, Jaime mieux pas
rajouter du code pour désactiver la suppression des CR+LF juste pour se site la ...

Laurent
0
ELCouz Messages postés 135 Date d'inscription jeudi 22 mars 2007 Statut Membre Dernière intervention 25 juillet 2008
29 mars 2008 à 07:40
sa me sort déja du code ****

merde à quand un bouton EDIT !!!!

Je l'attend avec impatience !
0
Rejoignez-nous