Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi WhiteSpaceTrim: Schnellere Version, wie aber trimmen? (https://www.delphipraxis.net/132421-whitespacetrim-schnellere-version-wie-aber-trimmen.html)

Go2EITS 12. Apr 2009 13:12


WhiteSpaceTrim: Schnellere Version, wie aber trimmen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz