RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN RIEN

cs_grandvizir
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
- 2 févr. 2005 à 15:55
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
- 29 avril 2006 à 07:49
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
38
29 avril 2006 à 07:49
petite amelioration


pour 100 000 requettes :

Florenth methode : ~1500ms(0.0140 < 0.0162 ms/r)
Fred methode : ~375ms (0.0035 < 0.0038 ms/r)
ma mienne : ~90ms (0.0007 < 0.0009 ms/r)

de plus elle prend en compte un plus large eventail de caracteres accentués...

function RemoveAcute(const S: string): string;
var
PResult : PChar;
PStr : PChar;
begin
Result := S;
PResult := PChar(Result);
PStr := PChar(S);
while PStr[0] <> #0 do begin
case PStr[0] of
#192..#197 : PResult[0] := 'A';
#199 : PResult[0] := 'C';
#200..#203 : PResult[0] := 'E';
#204..#207 : PResult[0] := 'I';
#209 : PResult[0] := 'N';
#210..#214 : PResult[0] := 'O';
#138 : PResult[0] := 'S';
#217..#220 : PResult[0] := 'U';
#159,#221 : PResult[0] := 'Y';
#142 : PResult[0] := 'Z';
#224..#229 : PResult[0] := 'a';
#231 : PResult[0] := 'c';
#232..#235 : PResult[0] := 'e';
#236..#239 : PResult[0] := 'i';
#241 : PResult[0] := 'n';
#242..#246 : PResult[0] := 'o';
#154 : PResult[0] := 's';
#249..#252 : PResult[0] := 'u';
#253,#255 : PResult[0] := 'y';
#158 : PResult[0] := 'z';
end;
inc(PResult);
inc(PStr);
end;
end;

directement inspiré d'exemple donnés par Florenth lui meme.
Fred_Ca_Pulse
Messages postés
20
Date d'inscription
mercredi 15 mars 2006
Statut
Membre
Dernière intervention
19 juin 2008

15 mars 2006 à 14:59
Bonjour à tous, moi aussi je propose ma contribution pour supprimer les accents :

function AccentsSupprimer( const SChaine : String ) : String;
const
SAccents = 'àäâãçéèêëìïîôöòûüùÿÁÀÄÂÃÉÈÊËÍÎÌÔÖÒÓÕÜÛÙÚÝ';
SSansAccents = 'aaaaceeeeiiiooouuyyAAAAAEEEEIIIOOOOOUUUUY';
var
ILong : Longint;
Source, Dest : PChar;
Source2Init, Dest2Init, Source2, Dest2 : PChar;
ILongSource, I : Longint;
CCaractere, CDestination : Char;
begin
// Init de la chaîne
ILong := Length( SChaine );
SetLength( Result, ILong );
Source := Pointer( SChaine );
Dest := Pointer( Result );
// Init de la recherche / remplacement
Source2Init := SAccents;
Dest2Init := SSansAccents;
ILongSource := Length( SAccents );
// Recherche / remplacement
while ILong <> 0 do begin
CCaractere := Source^;
CDestination := CCaractere;
Source2 := Source2Init;
Dest2 := Dest2Init;
I := ILongSource;
while I <> 0 do
if CCaractere = Source2^ then
begin // Remplacement
CDestination := Dest2^;
Break;
end
else
begin // Suivant
Inc( Source2 );
Inc( Dest2 );
Dec( I );
end;
// Avancement
Dest^ := CDestination;
Inc( Source );
Inc( Dest );
Dec( ILong );
end;
end;

D'après mes tests elle est environ 4 fois plus rapide que la fonction initiale proposée.
... mais bien sûr un peu plus longue.
... on peut peut-être faire encore mieux :)

FRED
cs_Delphiprog
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
9 janvier 2013
31
2 févr. 2005 à 18:55
C'est net, propre, efficace et rapide, si j'ai bien compris.

Bravo florenth.
cs_architect
Messages postés
6
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
12 février 2005

2 févr. 2005 à 16:48
Je te dirai cela ce week-end car je ne suis pas chez moi actuellement, mais promis je regarde de plus prés et puis je te dis cela !

Par contre un epetite question : quelle est la fonction "FillChar" qui est utilisé pour tout initialiser à zéro ?
Oui tu as peut-être raison grandvizir.
Je vais reprendre les idees citées dans ce sujet pour donner une explication plus approfondie ....

architect > De rien. J'espere que cela aura résolu ton problème.

@ ++ Flo
Afficher les 7 commentaires