AGB  ·  Datenschutz  ·  Impressum  







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

Trennzeichen suchen

Ein Thema von delphien · begonnen am 25. Nov 2005 · letzter Beitrag vom 25. Nov 2005
Antwort Antwort
delphien

Registriert seit: 25. Nov 2005
27 Beiträge
 
#1

Trennzeichen suchen

  Alt 25. Nov 2005, 17:54
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 !
  Mit Zitat antworten Zitat
Benutzerbild von storm1988
storm1988

Registriert seit: 4. Aug 2005
Ort: Salzburg
91 Beiträge
 
Delphi 6 Professional
 
#2

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 18:21
Willst du jetzt mit deiner Procedure nur nach Trennzeichen suchen ??? Denn wenn ja würd ich das ganze anders angehn...
Mfg st0rm

There are no stupid questions. Just stupid people.
  Mit Zitat antworten Zitat
delphien

Registriert seit: 25. Nov 2005
27 Beiträge
 
#3

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 18:38
hi, es scheitert bei mir an der Umsetzung, aber es muß so irgendwie gehen...
  Mit Zitat antworten Zitat
Benutzerbild von storm1988
storm1988

Registriert seit: 4. Aug 2005
Ort: Salzburg
91 Beiträge
 
Delphi 6 Professional
 
#4

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 19:16
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');
Mfg st0rm

There are no stupid questions. Just stupid people.
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#5

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 19:26
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
  Mit Zitat antworten Zitat
bioser

Registriert seit: 30. Aug 2005
140 Beiträge
 
#6

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 20:02
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;
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 20:43
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
  Mit Zitat antworten Zitat
bioser

Registriert seit: 30. Aug 2005
140 Beiträge
 
#8

Re: Trennzeichen suchen

  Alt 25. Nov 2005, 21:58
vielen dank, damit kann ich was anfangen !
  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 16:28 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