Hallo, ich habe meine neuen Kenntnisse durch Euch bei nachfolgender Funktion ausprobiert,
die in einem String Leerräume entfernt, wenn diese mehr als 1x vorkommen:
Delphi-Quellcode:
program CleanWhiteSpace;
{$APPTYPE CONSOLE}
uses
//FastMM4, FastMove,
//Optimize,
//RTLVclOptimize,
SysUtils, // Für Profiler.inc notwendig
Windows; // Für Profiler.inc notwendig
{$include Profiler.inc}
var xx,ii:Integer; // Nur für den Testlauf notwendig
// Original Version
// [EDIT] Code gelöscht. Veröffentlichung ist auf anderen Seiten nicht erlaubt.
function OldwhitespaceTrim(str : string) : string;
begin
// Leer
end;
//... Original Version ENDE
// Datum: 12.04.2009
// Löscht Leerräume, wenn diese mehr als 1x vorkommen.
//
// Neue Version
function WhiteSpaceTrim(const Str: string): String;
var
i, Len,space: Integer;
CurIn, CurOut: ^Char;
begin
Len := Length(Str);
SetLength(Result, Len);
CurIn := Pointer(Str);
CurOut := Pointer(Result);
space:= 0;
for i := 1 to Len do
begin
if space <> 1 then
begin
CurOut^ := CurIn^;
Inc(CurOut);
if(CurIn^ = ' ') then inc(space);
end
else
if Curin^ <> ' ' then
begin
CurOut^ := CurIn^;
Inc(CurOut);
space := 0;
end;
inc(curin);
end;
//SetLength(Result, Integer(CurOut) - Integer(Pointer(Result)));
SetLength(Result, CurOut - PChar(Pointer(Result)));
end;
begin
Writeln;
// [EDIT] Code gelöscht...
Writeln('Teste... WhiteStringTrim -neu- ');
for xx := 1 to 10 do
begin
Start;
for ii :=1 to 100000 do whitespaceTrim(' auf der Mauer ');
Stopp;
end;
Writeln('Ergebnis muss -auf der Mauer- sein:');
Writeln(whitespaceTrim('-'+' auf der Mauer '+'-'));Writeln;
Writeln('- ProgrammEnde mit [ENTER] -');Readln;
end.
Das Original mit fast 1000ms langsam, die neue Version benötigt nur ca. 40ms im vorliegendem Beispiel. Schön wäre noch eine Version, die die Leerräume links und rechts entfernt.
Dann noch ein LF zu beseitigen wäre wohl kein Problem.