![]() |
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:
Ich möchte die function GetNextToken folgendermaßen aufrufen:
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;
Delphi-Quellcode:
Kann jemand dabei behilflich sein ? DANKE !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 |
Re: Trennzeichen suchen
Willst du jetzt mit deiner Procedure nur nach Trennzeichen suchen ??? Denn wenn ja würd ich das ganze anders angehn...
|
Re: Trennzeichen suchen
hi, es scheitert bei mir an der Umsetzung, aber es muß so irgendwie gehen...
|
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:
Und nun der Aufruf:
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;
Delphi-Quellcode:
var
i: Boolean; begin i := findeTrennzeichen('[b]Hier das gewuenschte File[/b]'); if i = true then ShowMessage('String wurde Gefunden'); |
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. ";", 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 |
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:
Beim Aufruf wird das Token korrekt angezeigt. Er sieht so aus:
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;
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; |
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:
So kämst du an jedes Token (nacheinander).
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; 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:
So als ungetesteter Ansatz
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; |
Re: Trennzeichen suchen
vielen dank, damit kann ich was anfangen ! :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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