Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Schleifen und Suchroutinen (https://www.delphipraxis.net/96435-schleifen-und-suchroutinen.html)

k-- 24. Jul 2007 14:46


Schleifen und Suchroutinen
 
Hallo, werte DPler,

ich habe das Problem, welches die Kommentare im angehangen Quellcode schon andeuten:
Ich benötige eine Routine, die in einem RichEdit, welche den Quellcode einer HTM-Datei geladen hat, nach allen Textstrings absucht, welche zwischen
Code:
<a href="names.php?action=post&name=
und
Code:
&"><img src="images/pn.gif
liegen. Pro Datei werden genau 100 Namen enthalten sein. Die gefundenen Namen sollen dann in einem Array, eine TSringList oder etwas ähnlichem gespeichert werden, so das ich anschließend auf diese zugreifen kann. Allerdings, habe ich noch nie eine Suchroutine erstellt und per Suche bin ich zwar auf Routinen gestoßen, dessen Verlauf ich aber nicht nachvollziehen und damit nicht anpassen konnte. ;(


Delphi-Quellcode:
var a2, ausw, get, s: Integer;

// [...]
 
  // a2 ist die Anzahl der Dateien, welche zuvor heruntergeladen wurden
  for ausw := 1 to a2 do
    begin
      // rGetNames (TRichEdit) lädt nacheinander alle Dateien
      // Die Dateien befinden sich im Unterordner /query/ und heißen get*00.htm
      rGetNames.Lines.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'query\get'
                                   + FloatToStr(s) + '00.htm');
      // Schleife zum Auslesen der Namen
      for get := 1 to 100 do
        begin
          // Hier müsste die Suchschleife stehen, die alle 100 Namen pro .htm
          // ausliest und sie in einem Array oder einer TStringlist etc.
          // speichert, um sie anschließend in einer Ini (oder Textdokument)
          // zu verwahren:
         
          // Gesucht wird der Inhalt, der zwischen
          // "<a href="names.php?action=post&name=" und "&"><img src="images/pn.gif"
          // zu finden ist (100 Namen pro Datei)
        end;
    end;

Wo die Namen anschließend gespeichert werden, ist unwichtig, wichtig ist nur, dass ich auch nach einem Neustart der Applikation sie wieder benutzen kann.



MfG

Nikolas 24. Jul 2007 15:22

Re: Schleifen und Suchroutinen
 
Was du brauchst ist pos und PosEx. Damit kannst du einen Teilstring in deinem langen text suchen.
Du suchst also nach dem string der vor den Namen steht und merkst dir die Position vom ersten Zeichen des namens. Dann suchst du dahinter das nächste auftreten des Strings, der den Namen beendet und kopierst den Namen per Copy dorthin, wo du ihn haben willst.
Zum Speichern wird die Stringliste am besten sein, da sie schon die Befehle zum speichern und laden mitbringt.

dominikkv 24. Jul 2007 15:32

Re: Schleifen und Suchroutinen
 
das hab ich grad ohne delphi freihend zusammengeschrieben...
musst schauen, vllt wird eine stelle zuviel oder zuwenig kopiert...
Delphi-Quellcode:
var Namen : TStringList;
    i, a  : Byte;
    p     : Cardinal;
    s1, s2 : String;
 
  // ...

namen := TStringList.create;
p := 0;
s1 := '<a href="names.php?action=post&name=';
s2 := '&"><img src="images/pn.gif';

for i := 1 to 100 do
begin
  p := PosEx(s1, myString, p) + length(s1);
  a := PosEx(s2, myString, p) - p;

  namen.add(copy(myString, p, a));
end;

namen.SaveToFile('C:\Test.txt');

FreeAndNil(Namen);

k-- 24. Jul 2007 16:35

Re: Schleifen und Suchroutinen
 
Ersteinmal vielen Dank.

Ich versuchte es mit der Variante von dominikkv. Allerdings gibt Delphi eine Fehlermeldung aus, welche besagt, das in der Zeile
Delphi-Quellcode:
a := PosEx(s2, myString, p) - p;
Vorzeichenbehaftete und -lose Typen kombiniert werden. Nichtsdestotrotz startete es und auch die C:\Test.txt wurde erstellt, inder aber nur 101 Zeilen leere zu finden sind.


Nachtrag: OK, dieses Problem habe ich selbst gelöst bekommen. Ein weiteres ist, dass in der TXT immer nur die letzten 100 Namen und ein immer gleichbleibender Teil der HTM gespeichert wird.

Nikolas 24. Jul 2007 17:59

Re: Schleifen und Suchroutinen
 
Welcher Teil denn? Werden denn von Posex die richtigen zahlen geliefert? werden sie richtig kopiert?

alzaimar 24. Jul 2007 18:05

Re: Schleifen und Suchroutinen
 
Zitat:

Zitat von k--
Allerdings gibt Delphi eine Fehlermeldung aus, welche besagt, das in der Zeile ... vorzeichenbehaftete und -lose Typen kombiniert werden.

Das ist ja kein Fehler (sonst würde die EXE nicht starten), sondern eine Warnung.Es kann sein, das hier Murks passiert (wenn man positive und negative Zahlen kombiniert).

k-- 24. Jul 2007 18:06

Re: Schleifen und Suchroutinen
 
Also Beispielsweise rufe ich die ersten 300 Namen ab, macht 3x 100 Namen pro HTM.

In der Txt sieht es dann so aus:
Code:
Name 1
Name 2
[...]
Name 99
Name 100
et" type="text/css" href="http://aggressi9n.de/testserver/css/style3.css" />
      <title>Testsite</t
Name 1
Name 2
[...]
Name 99
Name 100
et" type="text/css" href="http://aggressi9n.de/testserver/css/style3.css" />
      <title>Testsite</t
Name 1
Name 2
[...]
Name 97
Name 98

Edit: Ersteres Problem konnt ich lösen, nun bleibt noch die Frage, wo die
Code:
et" type="text/css" href="http://aggressi9n.de/testserver/css/style3.css" />
      <title>Testsite</t
herkommen. Wohlgemerkt, befinden diese sich schon in der dritten Zeile jeder HTM (Die Namen sind viel später erst zu finden). Weder kurz vorher noch kurz nach dieser Stelle ist einer der gesuchten Strings zu finden.


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