![]() |
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:
Weiß wer was (www)? :coder2:
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; |
Re: Parse String - Satz splitten Problem
Hallo,
wie wäre es hiermit:
Delphi-Quellcode:
Ich habe aus dem var ein const gemacht, sowas wir Trim solltest Du am Besten außerhalb der Funktion machen.
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; Ü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:
Gruß
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; xaromz |
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