Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Parse String - Satz splitten Problem (https://www.delphipraxis.net/75865-parse-string-satz-splitten-problem.html)

Go2EITS 26. Aug 2006 08:55


Parse String - Satz splitten Problem
 
Guten Morgen, ich habe gerade ein Problem, mit dem ich mich an Euch wende.
Hat jemand eine elegantere Lösung? Insbesondere der Sonderfall gefällt mir nicht.

Die Funktion gibt mit ToList(h) das Wort aus dem Satz in eine TStringList.
Das letzte Wort wurde nicht gelesen, somit habe ich den Sonderfall eingebaut.
Geht es nicht eleganter/schneller?


Delphi-Quellcode:
Function ParseString(var s:String):Boolean;
CONST Letters :set of Char =['0'..'9','A'..'Z','a'..'z'];
Var h:String;
    i:Integer;
    flag:Boolean;
begin
result:=False;
H:='';
//Space am Anfang und Ende entfernen?
Trim(S);
if S=''then exit;
Flag:=False;
for i:=1 to length(s) do
begin
   if S[i] in Letters then
        begin
        Flag:=True;
        H:=H+S[i];
        // Sonderfall: Sonst wird das letzte Wort nicht angezeigt
        if I=length(s) then
           begin
           //showmessage(h);
           ToList(H);//Wird in Liste hizugefügt, wenn nicht vorhanden
           Flag:=false;
           h:='';
           end;
        // Sonderfall Ende
        end
   else
       if Flag=true then
       begin
          //showmessage(h);
          ToList(H);
          Flag:=false;
          h:='';
       end;
end;
end;
Weiß wer was (www)? :coder2:

xaromz 26. Aug 2006 09:20

Re: Parse String - Satz splitten Problem
 
Hallo,

wie wäre es hiermit:
Delphi-Quellcode:
function ParseString(const S: String): Boolean;
const
  Letters: set of Char = ['0'..'9', 'A'..'Z', 'a'..'z'];

var
  H: String;
  I: Integer;
begin
  Result := False;

  if S = '' then
    Exit;

  H := '';

  for I := 1 to Length(s) do
  begin
    if S[I] in Letters then
      H := H + S[I] // Wort zusammenbauen
    else
      if H <> '' then // Haben wir ein Wort?
      begin
        ToList(H); // Hinzufügen
        H := ''; // aufräumen
      end;
  end;

  if H <> '' then // Ist noch ein Wort übrig?
    ToList(H);
end;
Ich habe aus dem var ein const gemacht, sowas wir Trim solltest Du am Besten außerhalb der Funktion machen.
Übrigens setzt Du Result zwar am Anfang auf False, aber niemals auf True.

//Edit:
Einem String mit + immer wieder ein einzelnes Zeichen hinzuzufügen ist nicht sehr performant. Diese Lösung ist wahrscheinlich besser:
Delphi-Quellcode:
function ParseString2(const S: String): Boolean;
const
  Letters: set of Char =['0'..'9','A'..'Z','a'..'z'];

var
  L: Integer;
  I: Integer;
  Start: Integer;
begin
  Result := False;

  if S = '' then
    Exit;

  L := Length(S);

  Start := -1;
  for I := 1 to L do
  begin
    if S[I] in Letters then
    begin
      if Start = -1 then
        Start := I;
    end else
      if Start <> -1 then
      begin
        ToList(Copy(S, Start, I - Start));
        Start := -1;
      end;
  end;

  if Start <> -1 then
    ToList(Copy(S, Start, MaxInt));
end;
Gruß
xaromz

Go2EITS 26. Aug 2006 09:44

Re: Parse String - Satz splitten Problem
 
@xaroms
Vielen Dank! Der Code ist kürzer und scheint mir auch schneller zu sein. Kein BoolVariable "Flag" mehr notwendig und keine Sonderbehandlung mehr. Die Trim-Function erscheint mir auch nicht notwendig, da ja nur Letters abgefragt werden. Leere Strings werden nicht geparst und mit Exit "belohnt".

Die Funktion wird als Procedure umgebaut. Ich brauche ja keine Bestätigung, das der String geparst wurde. Die Lösung mit der Zeile: "//Ist noch ein Wort übrig? "ist viel schöner als meine Lösung.
Nett, dass Du Dir die Mühe gemacht hast, meinen Code zu verbessern. Und vor allen Dingen so schnell und vor allen Dingen: Funktionierend! :thumb:

Viele Grüße
Go2EITS

//EDIT
Den zweiten Code probiere ich auch aus. Auf dem ersten Blick, ohne ihn getestet zu haben, erscheint er mir "langsamer". Abr auf keinen Fall uninteressant. Bei 100 MB Textanlyse kann dies schon schon zeitlich sich schon sehr auswirken. Ich werde mal die Zeit stoppen.
//EDIT ENDE


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

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