Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Trennzeichen suchen (https://www.delphipraxis.net/57736-trennzeichen-suchen.html)

delphien 25. Nov 2005 17:54


Trennzeichen suchen
 
Moin, irgendwie stehe ich auf'm Schlauch und weiß nicht weiter. Bin absoluter Anfänger, deswegen richte ich nun meine Frage an die Profis. Ich habe hier ein Grundgerüst:


Delphi-Quellcode:
var sl:TSTringList;
    token:string;
   
function GetNextToken:Boolean;

var i,j:integer;
    str:string;

begin

for i:=0 to sl.count-1 do
begin
 token := '';
 str := sl.Strings[i];

 for j:=0 to length(str) do
 begin
 //bis zum Trennzeichen, z.B. ";", Zeichen zusammenfügen
 token := token + str[j];  
 end;

end;

end;
Ich möchte die function GetNextToken folgendermaßen aufrufen:

Delphi-Quellcode:

var
   ende:Boolean;

sl := TStringList.Create;
sl.loadfromFile('c:\testfile.txt');

ende := FALSE;

while not Ende do begin

if Token <> '' then
begin
  ende := not GetNextToken;
  //Jedes Token wird hier benötigt !
end;

end;//while
Kann jemand dabei behilflich sein ? DANKE !

storm1988 25. Nov 2005 18:21

Re: Trennzeichen suchen
 
Willst du jetzt mit deiner Procedure nur nach Trennzeichen suchen ??? Denn wenn ja würd ich das ganze anders angehn...

delphien 25. Nov 2005 18:38

Re: Trennzeichen suchen
 
hi, es scheitert bei mir an der Umsetzung, aber es muß so irgendwie gehen...

storm1988 25. Nov 2005 19:16

Re: Trennzeichen suchen
 
So, wenn du jetzt nur nach einem bestimmten Char bzw. String in einen File suchen willst würd ich des so machen:

Erst mal die Funktion:

Delphi-Quellcode:
function findeTrennzeichen(Pfad:string):Boolean;
var
  myFile : TextFile;
  text  : string;
begin


   AssignFile(myFile,Pfad);
    Reset(myFile);

     while not Eof(myFile) do
    begin
      ReadLn(myFile, text);
     if Pos('[b]Hier den geünschten String/Char reinschreiben[/b]', text) <> 0 then
          Result := true;
     end;





end;
Und nun der Aufruf:

Delphi-Quellcode:
var
  i: Boolean;
begin
  i := findeTrennzeichen('[b]Hier das gewuenschte File[/b]');
  if i = true then
    ShowMessage('String wurde Gefunden');

Der_Unwissende 25. Nov 2005 19:26

Re: Trennzeichen suchen
 
HI,
was möchtest du denn da nachbauen? Ich denke die Funktionalität die du suchst findest du eigentlich schon in einer TStringList (in der OH nach Delimitter und DelimittedText suchen).
Aber wenn du einen StringTokenizer willst, solltest du nicht gucken ob dein Token leer ist sondern deine Funktionalittät erweitern. Üblich ist eine Methode getTokenCount, getNextToken und natürlich hasMoreToken.

Wenn du nach einem bestimmten Zeichen in einem String suchst, geht dass am einfachsten und effizientesten mit Pos. Mit dem Befehl kannst du in deinem zu zerlegenden String nach dem nächsten Vorkommen vom Trennzeichen suchen und bis zu dieser Stelle deinen String teilen/kopieren/was auch immer.
Was du jetzt machst ist eine sehr schlechte Variante, funktioniert zwar (ok, nicht so wie du es aufgeschrieben hast), aber es wäre ein sehr unsauberer Weg (tocken := tocken + str[j] alloziert ne Menge Speicher).
Wie gesagt, mach es lieber mit Pos und zerleg so deinen String.

Zu deinem Code
[quote="delphien"]
for i := 0 to sl.count - 1 do
begin
token := '';
str := sl.Strings[i];

for j := 0 to length(str) do
begin
//bis zum Trennzeichen, z.B. ";&quot;, Zeichen zusammenfügen
token := token + str[j];
end;
end;
[/delphi]

Du solltest deinen Code etwas hierachisch einrücken. Dann sieht man leichter was in welcher Beziehung zu einander steht. Wichtig ist, bei dynamsichen Arrays beginnt der Index bei 0, bei Strings läuft der Index von 1 an (also in deiner for j := ...) Hat etwas die Länge n und du fängst bei 0 an zu zählen, darfst du auch nur bis (n-1) laufen. Wie gesagt mit deinem to hast du recht, aber vorne muss ne 1 hin.
In der Schleife setzt du ja auch dein Token zusammen. Aber es fehlt natürlich noch was, du musst an der Stelle noch prüfen, ob du gerade das Trennzeichen liest (if-Anweisung). Dann musst du halt gucken was ist wenn es das Trennzeichen ist und was sonst.

Gruß Der Unwissende

bioser 25. Nov 2005 20:02

Re: Trennzeichen suchen
 
hi, ich habe es nun soweit hinbekommen, daß ich innerhalb der Funktion GetNextToken
auf das Token selbst zugreifen kann. Allerdings klappt das noch nicht beim Aufruf.

Delphi-Quellcode:
function GetNextToken():Boolean;

var i,j:integer;
    str:string;
begin

for i:=0 to sl.count-1 do
begin
 str := sl.Strings[i];
 for j:=1 to length(str) do
 begin
   if isSeparator(str[j])
   then begin
      ShowMessage(Token);
      Token := '';
   end
   else begin
     Token := Token + str[j];
   end;//else
   end;//if
 end;//for
end;//for
Result := FALSE;
end;
Beim Aufruf wird das Token korrekt angezeigt. Er sieht so aus:

Delphi-Quellcode:
ende:=FALSE;

while (not Ende) do
begin
 ende := not GetNextToken();
 //hier will ich jedes Token haben und damit weiterarbeiten
 //z.B. Add(Token);
end;

Der_Unwissende 25. Nov 2005 20:43

Re: Trennzeichen suchen
 
Na ja, dein Problem ist es, dass du in deiner Schleife schon über alle Strings der StringListe gehst und hier jeden String schon zerlegst. Ein StringTokenizer wird eigentlich nur auf ein String angewendet. Mal etwas abstrakt:
Delphi-Quellcode:
var StringTokenizer : TStringTokenizer;
    List : TStrings;
    i : Integer;
    buffer : String;
begin
  // Erzeugen eines TStringtokenizer zu geg. Trennzeichen
  StringTokenizer := TStringTokenizer.Create(Trennzeichen);

  // Prüfen ob die Stringlist leer ist
  if List.Count > 0 then
    begin
      // alle Strings der StringList durchgehen
      for i := 0 to List.Count - 1 do
        begin
          // einen String auswählen
          StringTokenizer.zuZerlegenderString := List.Strings[i];
         
          // String in alle seine Token zerlegen
          while StringTokenizer.hasMoreToken do
            begin
              buffer := StringTokenizer.getNextToken;
              // mache was mit diesem Token
            end;
        end;
    end;
end;
So kämst du an jedes Token (nacheinander).
Natürlich fehlt die komplette Implementierung deines TStringTokenizer. Eine sehr einfache Methode ist es aber wie gesagt, den String einfach mittels Pos auf weitere Vorkommen zu prüfen und ggf. zu Trennen.
Anders gesagt
Delphi-Quellcode:
function TStringTokenizer.hasMoreToken : Boolean;
begin
  result := length(self.zuZerlegenderString) > 0;
end;

function TStringTokenizer.getNextToken : String;
var buffer : Integer;
begin
  result := '';
  if length(self.zuZerlegenderString) > 0 then
    begin
      buffer := Pos(self.Trennzeichen, self.zuZerlegenderString);
      if buffer > 0 then
        begin
          result := LeftStr(self.zuZerlegenderString, (buffer - 1));
          self.zuZerlegenderString := RightStr(self.zuZerlegenderString, length(self.zuZerlegenderString) - (buffer + 1));
        end
      else
        begin
          result := self.zuZerlegenderString;
          self.zuZerlegenderString := '';
        end;
    end;
end;
So als ungetesteter Ansatz

bioser 25. Nov 2005 21:58

Re: Trennzeichen suchen
 
vielen dank, damit kann ich was anfangen ! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 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