ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 juillet 2008
-
25 mars 2008 à 20:39
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 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.
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 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;
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 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.
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 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 ?
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é
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 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
cs_Loda
Messages postés814Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention30 juillet 20093 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.
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 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 !!!
ELCouz
Messages postés135Date d'inscriptionjeudi 22 mars 2007StatutMembreDernière intervention25 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 ...