Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wörter in einer Datei finden (https://www.delphipraxis.net/77826-woerter-einer-datei-finden.html)

Ajin 25. Sep 2006 13:57


Wörter in einer Datei finden
 
Hi DP!

Ich muss mich demnächst mit allerlei Dateien und deren Inhalt auseinandersetzen. Bestimmte Werte in vielen unterschiedlichen Dateien müssen angepasst werden und das recht häufig. Deshalb mein Entschluss mir dafür eine kleine Anwendung zu schreiben.

Ich habe eine Textdatei da steht allerlei Krimskrams drin - unter anderem auch eine Versionsnummer. Diese möchte ich gerne auslesen. Über die Foren Suchfunktion bin ich über TStringlist gestolpert. Viel gearbeitet habe ich damit leider nicht.

Folgenden Code habe ich mir gebastelt:

Delphi-Quellcode:
//gleich nach Programmstart prüfen!
procedure TFmain.FormCreate(Sender: TObject);
var
version: string;
s1:TStringlist;
i, zeilennr:integer;
Begin
 //Prüfen ob die Datei bla.txt existiert
 if FileExists('C:\bla.txt') then
 begin
    s1:=TStringList.Create;
    s1.LoadFromFile('C:\bla.txt');
    i:=0;

    try

    for zeilennr:=0 to s1.Count-1 do begin //Schleife über alle Zeilen, Zählung
                                            //beginnt mit 0, die Eigenschaft Count
                                            //enthält die Gesamtzahl der Zeilen

    if s1[zeilennr]='Version =' then //wenn der Text "Version" gefunden wurde,
        ShowMessage('Version gefunden in Zeile '+IntToStr(zeilennr+1)); //Meldung ausgeben
    end;
  finally
    s1.free; //Objekt wieder freigeben
  end;
    l_blaver.Caption:='Bla Version: ';
 end
 else
 begin
   l_faustver.Caption:='bla nicht gefunden'
 end;


End;
Was ich gerne hätte:
-Also nach dem Programmstrart prüfen ob die Datei existiert (wenn nicht: motzen)
-datei in Stringlist laden
-Stringlist nach 'Version =' durchsuchen
-Text nach dem '=' in variable speichern und am ende ausgeben


Das Problem:
In der Datei bla.txt steht die Version in der 3. Zeile allerdings in dieser Form: '_____Version = 1.0'
D.h. mit ein paar Leerzeichen dazwischen. (das Forum eliminiert die Leerzeichen, deshalb hab ich den Unterstrich verwendet).

Wie stell ich denn das nun an, dass meine Routine trotzdem das Wort 'Version' findet und nach dem = Zeichen sich die 1.0 merken kann?

chrisw 25. Sep 2006 14:33

Re: Wörter in einer Datei finden
 
So könnte man das machen ! (Sicher nicht das Optimum)


Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const SearchString = 'Version=';
      filename    = 'c:\mytextfile.txt';

var MyTextFileContent : TStringList;
    i                : Integer;
    tempStr          : String;
begin
  MyTextFileContent := TStringList.Create;
  try
    MyTextFileContent.LoadFromFile(filename);
  except
    Showmessage('Motz');
    MyTextFileContent.Free;
    exit;
  end;
  for i := 0 to MyTextFileContent.Count -1 do
    if pos(SearchString,MyTextFileContent[i]) <> 0 then
    begin
      tempStr := MyTextFileContent[i];
      delete(tempStr,1,pos(SearchString,MyTextFileContent[i])+ length(SearchString)-1);
      //VariableX := tempStr;
      showmessage('gefunden in Zeile ' + Inttostr(i +1));
      MyTextFileContent.Free;
      exit;
    end;
  MyTextFileContent.Free;
end;

pathfinder78 25. Sep 2006 14:42

Re: Wörter in einer Datei finden
 
Es gibt auch eine einfachere Lösung, nämlich über die Text-Eigenschaft auf den gesamten Inhalt zugreifen, also etwa so:
Delphi-Quellcode:
s1:=TStringList.Create;
s1.LoadFromFile('C:\bla.txt');
//Absolute Position (1. Vorkommen) des Strings suchen
i:=Pos('Version', s1.Text);
//Wenn nichts gefunden wurde, ist i=0
//Ausschneiden ab dieser Position, dann nach Zeilenende suchen (#13+#10), fertig

Ajintaro 26. Sep 2006 07:49

Re: Wörter in einer Datei finden
 
Hey chrisw die Lösung funktionert einwandfrei!
Nun stellt sich mir die Frage: wie kann ich in der MyTextfilecontent an der Pos des SearchString die nächsten Zeichen merken bis zum 1. Leerzeichen?

Version = 1.0.0.2.3.4

d.h. nach dem '=' folgt ein Leerzeichen, dann eine folge von Zeichen bis man wieder auf eine Leerstelle trifft.

Wenn ich das lösen könnte wär ich erlöst :)

chrisw 26. Sep 2006 08:50

Re: Wörter in einer Datei finden
 
So könnte man das machen !

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const SearchString = 'Version=';
      filename    = 'c:\mytextfile.txt';

var MyTextFileContent : TStringList;
    i,j              : Integer;
    tempStr          : String;
    ErstesLeerzeichen : Boolean;
begin
  MyTextFileContent := TStringList.Create;
  try
    MyTextFileContent.LoadFromFile(filename);
  except
    Showmessage('Motz');
    MyTextFileContent.Free;
    exit;
  end;
  for i := 0 to MyTextFileContent.Count -1 do
    if pos(SearchString,MyTextFileContent[i]) <> 0 then
    begin
      tempStr := MyTextFileContent[i];
      delete(tempStr,1,pos(SearchString,MyTextFileContent[i])+ length(SearchString)-1);
      ErstesLeerzeichen := False;
      for j := Length(tempstr) downto 0 do
        begin
          if ErstesLeerzeichen and (tempStr[i] = ' ') then break;
          if tempStr[i] <> ' ' then delete(tempStr,i,1) else ErstesLeerzeichen := True;
        end;
      showmessage('Der gesuchte String lautet : ' + tempstr + #13#10 + 
                  'Er wurde gefunden in Zeile ' + Inttostr(i +1));
      MyTextFileContent.Free;
      exit;
    end;
  MyTextFileContent.Free;
end;

chrisw 26. Sep 2006 08:58

Re: Wörter in einer Datei finden
 
Oder noch einfacher :
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const SearchString = 'Version= '; // hier ein Leerzeichen einfügen
      filename    = 'c:\mytextfile.txt';

var MyTextFileContent : TStringList;
    i,j              : Integer;
    tempStr          : String;
    ErstesLeerzeichen : Boolean;
begin
  MyTextFileContent := TStringList.Create;
  try
    MyTextFileContent.LoadFromFile(filename);
  except
    Showmessage('Motz');
    MyTextFileContent.Free;
    exit;
  end;
  for i := 0 to MyTextFileContent.Count -1 do
    if pos(SearchString,MyTextFileContent[i]) <> 0 then
    begin
      tempStr := MyTextFileContent[i];
      delete(tempStr,1,pos(SearchString,MyTextFileContent[i])+ length(SearchString)-1);
      //diese Zeile einfügen
      if pos(' ', tempstr) <> 0 then delete(tempstr,pos(' ', tempstr),1000);
      showmessage('Der gesuchte String lautet : ' + tempstr + #13#10 +
                  'Er wurde gefunden in Zeile ' + Inttostr(i +1));
      MyTextFileContent.Free;
      exit;
    end;
  MyTextFileContent.Free;
end;

Ajintaro 26. Sep 2006 09:34

Re: Wörter in einer Datei finden
 
:hello: chrisw du GOTT :)

Genau das ist es! Das ist für mich die Grundlage für weitere Überlegungen und Dateioperationen!
Im Prinzip hattest du oben beim Searchstring einen guten Einfall: einfach das Leerzeichen bis zum = mit einbauen :)

Jetzt noch ein wenig Sonnenschein und der Tag ist gerettet! :dp:

Danke nochmals für die super Hilfe!

/bow

Ajin

Ajin 9. Okt 2006 14:39

Re: Wörter in einer Datei finden
 
Hallo ihr lieben!

Hm die obigen Codeschnipsel sind wirklich gut, aber jetzt hab ich ne wirklich harte Nuss. Eine Textdatei sieht so aus:

EXER/TIMO 33/STEFAN//
MSHAHA/MEINEOMA/GAMMICH/-/-//
SOISTES/NUNMAL//
TRALALA/NUNJA/BANAL//

Es sind mehrere Zeilen. Der Zeilenabschluss bildet jeweils ein doppel '/'
Dann beginnt die nächste Zeile.

Schwierig ist: Das Textfile von der 1. Zeile an zu lesen bist zum ersten / --> Das Wort in einem Edit-Feld ablegen
weiterlesen bis zum nächsten / --> das Wort in einem Edit ablgegen. Und das bis zum Zeilenende bzw EOF

Für das obige Beispiel müsste dann im
1. Edit stehen: EXER
2. Edit: TIMO 33
3. Edit: STEFAN
4. Edit: MSHAHA

usw.

In wie weit müsste ich den obigen Quelltext ändern oder besser einen neuen verfassen?

Klaus01 9. Okt 2006 14:46

Re: Wörter in einer Datei finden
 
Du könntest mit Hilfe der Stringlist und der property Delimiter: Char;
den '/' als Textdelimiter nehmen.
In der Hilfe mal nach DelimetedText suchen.

Die doppelten / solltest Du dann vorher durch einen einfachen / ersetzen.
Hierzu könnte StringReplace nützlich sein.

Noch eine Anmerkung: Normalerweise solltest Du für jede neue Frage einen eigenen Thread
anfangen.

Grüße
Klaus


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