AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parse String - Satz splitten Problem

Ein Thema von Go2EITS · begonnen am 26. Aug 2006 · letzter Beitrag vom 26. Aug 2006
Antwort Antwort
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#1

Parse String - Satz splitten Problem

  Alt 26. Aug 2006, 09:55
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)?
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Parse String - Satz splitten Problem

  Alt 26. Aug 2006, 10:20
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
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#3

Re: Parse String - Satz splitten Problem

  Alt 26. Aug 2006, 10:44
@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!

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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