Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Überschrift aus Textdatei finden. (https://www.delphipraxis.net/157410-ueberschrift-aus-textdatei-finden.html)

Chris1896 11. Jan 2011 11:10

Überschrift aus Textdatei finden.
 
Hallo Leute,

habe folgende Aufgabe bekommen und weiß nicht wie ich Anfangen soll (Bin noch frischling im Programmieren mit Delphi)

- Quelltext von FAZ.net als text datei speichern. Okay das bekomme ich auch noch hin :D
- Dieser Inhalt soll nun auf seine Titelzeilen untersucht werden. Die Titelzeilen sind per Knopfdruck in einem Memofeld auszugeben. Dazu lesen Sie die Datei Zeile für Zeile und werten diese dann aus.
- Zum Finden einer Überschrift suchen Sie den Unterstring ' “H1“>'. Daraufhin suchen Sie das folgende 'größer'-Zeichen. Hier fängt der Titel an. Er endet vor dem folgenden 'kleiner'-Zeichen. Ggf. enthält eine Zeile mehrere Titel. Wenn Sie die Zeile durchgearbeitet haben,lesen Sie die nächste und so fort, bis zum Ende der Datei. Die Anzahl der Überschriften ist in einem Label auszugeben.

Ich hoffe ihr könnt mir helfen.

Gruß Chris

DeddyH 11. Jan 2011 11:17

AW: Überschrift aus Textdatei finden.
 
Such einmal hier im Forum nach Hier im Forum suchenPosEx.

Deep-Sea 11. Jan 2011 11:23

AW: Überschrift aus Textdatei finden.
 
Kommt mir irgendwie bekannt vor :gruebel: >>> Mit readln nur bestimmte Textstelle auslesen
Und wie dort gilt auch hier: Ein HTML-Parser (bzw. bei XHTML geht auch ein XML-Parser) ist die bessere Wahl.

p80286 11. Jan 2011 12:05

AW: Überschrift aus Textdatei finden.
 
Irgendwie habne ich das unbestimmte Gefühl, daß die Suche nach H1 nicht so richtig zielführend ist:

Zitat:

<div class="H2"><a href="/s/Rub0E9EEF84AC1E4A389A8DC6C23161FE44/Doc~EA0D974B76CAA416CA0AE2CBC81D14397~ATpl~Ecommon ~Scontent.html">Hunderte Schweine werden geschlachtet</a></div>
<div class="H1"><a href="/s/Rub0E9EEF84AC1E4A389A8DC6C23161FE44/Doc~EA0D974B76CAA416CA0AE2CBC81D14397~ATpl~Ecommon ~Scontent.html">Erstmals erhöhter Dioxinwert in Schweinefleisch</a></div>
<p><span style="cursor:pointer;" onclick="location='/s/Rub0E9EEF84AC1E4A389A8DC6C23161FE44/Doc~EA0D974B76CAA416CA0AE2CBC81D14397~ATpl~Ecommon ~Scontent.html';">Der Dioxin-Skandal weitet sich aus: In Niedersachsen müssen nun mehrere hundert Schweine getötet werden, weil überhöhte Dioxinwerte erstmals auch in Schweinefleisch nachgewiesen werden konnten. Am Nachmittag tagt im Bundestag der Verbraucherausschuss zum Thema <nobr>Dioxin.<a rel="nofollow" href="/s/Rub0E9EEF84AC1E4A389A8DC6C23161FE44/Doc~EA0D974B76CAA416CA0AE2CBC81D14397~ATpl~Ecommon ~Scontent.html"><img src="/f30/Images/LinkIcons/linkwinkel.gif" class="LinkWinkel" alt="" /></a></nobr></span></p><div class="LinkAbstand">&nbsp;</div>
<a href="/s/Rub0E9EEF84AC1E4A389A8DC6C23161FE44/Doc~EB567D664DE2843D09A6D26C22C8D5C08~ATpl~Ecommon ~Scontent.html" class="ArrowLinkRight">Dioxin-Skandal: Aigner will härtere Regeln für Futtermittelindustrie</a><div class="clear"></div>
</div>
</div>
da kommt man mit einem Parser doch etwas einfacher ans Ziel.

Gruß
K-H

Chris1896 11. Jan 2011 15:38

AW: Überschrift aus Textdatei finden.
 
Danke schonmal für die Hilfe, komme aber irgendwie trotzdem nicht weiter habe folgenden Quellcode hier im Forum gefunden und wenn ich das Testen will kommen Fehler

Code:
s := 'Hallo; Guten Tag; Guten Morgen; Guten Abend;';
Pos1 := Pos(';', s);
if Pos1 <> 0 then // erstes Semikolon gefunden
begin
  // Position des zweiten Semikolons ermitteln;
  // dazu fangen wir gleich nach dem ersten Semikolon an zu suchen:
  Pos2 := PosEx(';', s, Pos1 + 1);
  if Pos2 <> 0 then
    ShowMessage('gefunden an Position: ' + IntToStr(Pos2))
  else
    ShowMessage('nur ein Semikolon im String vorhanden');
  end
  else
  begin
    ShowMessage('kein Semikolon im String vorhanden');
  end;

DeddyH 11. Jan 2011 15:42

AW: Überschrift aus Textdatei finden.
 
Es wäre zuckersüß von Dir, wenn Du
-statt Code-Tags Delphi-Tags verwenden würdest
-uns sagst, welche Fehler auftreten

p80286 11. Jan 2011 16:03

AW: Überschrift aus Textdatei finden.
 
Wollen wir wetten, daß
Delphi-Quellcode:
uses StrUtils;
fehlt?

Gruß
K-H

Chris1896 11. Jan 2011 16:26

AW: Überschrift aus Textdatei finden.
 
unit1.pas(77,1) Error: Illegal expression

und in dieser zeile steht initialization

p80286 11. Jan 2011 16:38

AW: Überschrift aus Textdatei finden.
 
Jetzt wäre es hilfreich die ganze Unit zu sehen, oder zumindestens die letzten 10..20 Zeilen, den
Delphi-Quellcode:
initialization
als soches ist fehlerfrei. Die Ursache der Fehlermeldung müßte also davor liegen.

Gruß
K-H

Chris1896 11. Jan 2011 16:41

AW: Überschrift aus Textdatei finden.
 
Button1Klick war nur ne probe die funktioniert hat...
Benutze Lazarus aber ist doch eigentlich wie delphi oder kommt das dadurch?
Danke dir für deine Hilfe

Delphi-Quellcode:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, StrUtils;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile;
    S: string;
   begin
   if OpenDialog1.Execute then { Dialog zum Dateiöffnen anzeigen }
begin
   AssignFile(F, OpenDialog1.FileName); { Datei ausgewählt }
   Reset(F);
   Readln(F, S); { Erste Zeile der Datei lesen }
   Edit1.Text := S; { String in ein TEdit schreiben }
   CloseFile(F);
   end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var Pos1, Pos2, Pos3: byte;
 s : string; f : textfile;
 begin
s := 'Hallo; Guten Tag; Guten Morgen; Guten Abend;';
Pos1 := Pos(';', s);
if Pos1 <> 0 then // erstes Semikolon gefunden
begin
  // Position des zweiten Semikolons ermitteln;
  // dazu fangen wir gleich nach dem ersten Semikolon an zu suchen:
  Pos2 := PosEx(';', s, Pos1 + 1);
  if Pos2 <> 0 then
    edit1.Text:='gefunden an Position: ' + IntToStr(Pos2)
  else
    ShowMessage('nur ein Semikolon im String vorhanden');
  end
  else
  begin
    ShowMessage('kein Semikolon im String vorhanden');
  end;





initialization
  {$I unit1.lrs}

end.

alfold 11. Jan 2011 16:48

AW: Überschrift aus Textdatei finden.
 
Im ersten Überblick würde ich sagen, da fehlt doch das 'end;' am Ende deiner 2.Procedure

GRuss alfold

Chris1896 11. Jan 2011 16:51

AW: Überschrift aus Textdatei finden.
 
Oh,... man jetzt sind sogar die einfachsten Sachen zu schweer für mich :D
Danke dir, probiere jetzt mal weiter und wenn ich nicht weiter komme melde ich mich wieder.
gruß

p80286 11. Jan 2011 16:57

AW: Überschrift aus Textdatei finden.
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
  Pos1, Pos2, Pos3: byte;
  s : string; f : textfile;
begin
  s := 'Hallo; Guten Tag; Guten Morgen; Guten Abend;';
  Pos1 := Pos(';', s);
  if Pos1 <> 0 then // erstes Semikolon gefunden
  begin
    // Position des zweiten Semikolons ermitteln;
    // dazu fangen wir gleich nach dem ersten Semikolon an zu suchen:
    Pos2 := PosEx(';', s, Pos1 + 1);
    if Pos2 <> 0 then
      edit1.Text:='gefunden an Position: ' + IntToStr(Pos2)
    else
      ShowMessage('nur ein Semikolon im String vorhanden');
  end
  else
  begin
    ShowMessage('kein Semikolon im String vorhanden');
  end;
//vvv ---- und das hier einfügen!!
end;
wäre der Code ordentlich formatiert gewesen.......
Gruß
K-H

Matze 11. Jan 2011 17:06

AW: Überschrift aus Textdatei finden.
 
Was hast du denn genau vor?

Wenn du für dich persönlich einen Zeitungs-Reader basteln möchtest, ist das Parsen des HTML-Codes ungeeignet. Wenn die FAZ etwas daran ändert, funktioniert dein Programm möglicherweise nicht mehr.

Die Überschriften und eine kurze Zusammenfassung des Inhalts erhältst du auch über die ganzen Newsfeeds von denen (z.B. hier die Kategorie "Aktuelles").
Das ist ein standardisiertes Format und das wirst du daher immer auslesen können. Wenn du den ganzen Text lesen möchtest, musst du halt auf deren Website schauen.

Oder worum geht's dir genau? Was für ein Programm soll das werden?

Chris1896 11. Jan 2011 18:52

AW: Überschrift aus Textdatei finden.
 
Das ist eine Praktikumsaufgabe fürs Studium


Aufgabe 5 - Textparser

Für die Durchführung des Praktikumprogrammes müssen Sie sich zunächst eine Datei aus dem Internet laden. Sie gehen mit dem Browser auf FAZ.net und wählen „Politik“. Von dieser Seite lassen Sie sich den Seitenquelltext anzeigen, kopieren ihn in die Zwischenablage und speichern den Inhalt z.B. mit dem Editor auf eine Datei FAZ.txt.

Dieser Inhalt soll nun auf seine Titelzeilen untersucht werden. Die Titelzeilen sind per Knopfdruck in einem Memofeld auszugeben. Dazu lesen Sie die Datei Zeile für Zeile und werten diese dann aus.

Zum Finden einer Überschrift suchen Sie den Unterstring ' “H1“>'. Daraufhin suchen Sie das folgende 'größer'-Zeichen. Hier fängt der Titel an. Er endet vor dem folgenden 'kleiner'-Zeichen. Ggf. enthält eine Zeile mehrere Titel. Wenn Sie die Zeile durchgearbeitet haben,lesen Sie die nächste und so fort, bis zum Ende der Datei. Die Anzahl der Überschriften ist in einem Label auszugeben

Matze 11. Jan 2011 19:49

AW: Überschrift aus Textdatei finden.
 
Achso. Ich dachte, das hast du irgendwo als Anleitung gefunden.
Gut, dann bringt dir der RSS-Feed natürlich nichts.

Chris1896 11. Jan 2011 19:54

AW: Überschrift aus Textdatei finden.
 
Aber irgendwie komme ich nicht weiter... mit dem Quelltext den ich gepostet habe kann ich ja immoment die Pos eines beliebigen zeichens herausfinden aber wie mache ich das ich “H1“> finde und das darauf folgende >finde und den text bis zum < ausgeben kann?
komme da nicht weiter

DeddyH 12. Jan 2011 07:09

AW: Überschrift aus Textdatei finden.
 
Das ist doch nicht sooo schwer:
- mit Pos(Ex) den ersten Teilstring suchen und Position in einer Variablen merken
- wieder mit PosEx ab dieser Position (+ Länge des Teilstrings) den "Ende"-String suchen und auch merken
- bei Fund alles zwischen diesen beiden Positionen kopieren
- erste Variable auf den Wert der zweiten (+ Länge des "Ende"-Strings) setzen
- alles nochmal von vorn, bis keine Funde mehr existieren

Chris1896 12. Jan 2011 13:06

AW: Überschrift aus Textdatei finden.
 
So, habe jetzt mal ein bisschen probiert, aber irgendwie funktioniert das noch nicht.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Pos1, Pos2,Pos3: byte;
     s, SubStr: string;
begin
s := '<div class="H1"><a href="/s/RubD16E1F55D21144C4AE3F9DDF52B6E1D9/Doc~E9E3E544B0814490A9D64596C57269FAB~ATpl~Ecommon~Scontent.html">Bahn bestellt 137 Doppelstockwagen</a></div>';
Pos1 := Pos('"H1">', s);
if Pos1 <> 0 then // überschrift gefunden
begin
  Pos2 := PosEx('>', s, Pos1 + 1);
  Pos3 := PosEx('<', s, Pos2 + 1);
  if Pos2 <> 0 then
    SubStr := Copy(s, Pos2, Pos3);
    ShowMessage(SubStr + '');
  end;
end;
Eigentlich habe ich jetzt so gedacht das ich mit Pos1 "H1"> als erste Position gefunden habe mit Pos2 das nächste > zeichen und mit Pos3 das nächste < zeichen und das kopiere und als ShowMessage das der Text kommen müsste: Bahn bestellt 137 Doppelstockwagen
Wo ist mein Fehler dort?

DeddyH 12. Jan 2011 13:09

AW: Überschrift aus Textdatei finden.
 
Zitat:

Delphi-Quellcode:
Pos2 := PosEx('>', s, Pos1 + 1);

Wieso Pos1 + 1? Rate einmal, welches Zeichen Du damit erwischst.

Deep-Sea 12. Jan 2011 13:11

AW: Überschrift aus Textdatei finden.
 
Der Code
Delphi-Quellcode:
Pos2 := PosEx('>', s, Pos1 + 1);
findet das >, was bei "H1"> steht, denn Pos1 verweist auf den Anfang des Teilstrings und somit suchst du schon ab dem Zeichen H weiter und nicht erst nach dem Zeichen >.

PS: Copy erwartet als 3. Parameter die Anzahl der zu kopierenden Zeichen und keinen Index.

Chris1896 12. Jan 2011 13:23

AW: Überschrift aus Textdatei finden.
 
Zitat:

Zitat von Deep-Sea (Beitrag 1074151)
Der Code
Delphi-Quellcode:
Pos2 := PosEx('>', s, Pos1 + 1);
findet das >, was bei "H1"> steht, denn Pos1 verweist auf den Anfang des Teilstrings und somit suchst du schon ab dem Zeichen H weiter und nicht erst nach dem Zeichen >.

Okay das ist mir einleuchtend also +5 weil ich von zeichen habe und er danach weiter such soll.

Zitat:

Zitat von Deep-Sea (Beitrag 1074151)
PS: Copy erwartet als 3. Parameter die Anzahl der zu kopierenden Zeichen und keinen Index.

Woher weiß ich den wieviele zeichen meine überschrift hat können doch unterschiedlich sein. verstehe ich nicht. Aber erstmal danke euch beiden für die hilfe, muss sagen das es ein sehr gutes forum hier ist hier bekommt man schnell antwort

Bummi 12. Jan 2011 13:27

AW: Überschrift aus Textdatei finden.
 
Um bei Deinem Vorgehen zu bleiben...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var Pos1, Pos2,Pos3,Pos4,Pos5: integer;
     s, SubStr: string;
begin
s := '<div class="H1"><a href="/s/RubD16E1F55D211content.html">Bahn bestellt 137 Doppelstockwagen</a></div>';
Pos1 := Pos('"H1">', s);
if Pos1 <> 0 then // überschrift gefunden
begin
  Pos2 := PosEx('>', s, Pos1 );
  Pos3 := PosEx('<', s, Pos2 );
  Pos4 := PosEx('>', s, Pos3 );
  Pos5 := PosEx('<', s, Pos4 );
  if Pos5 <> 0 then
    SubStr := Copy(s, Pos4 + 1, Pos5 - POS4 - 1);
    ShowMessage(SubStr + '');
  end;

end;

Klaus01 12. Jan 2011 13:28

AW: Überschrift aus Textdatei finden.
 
sodele

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var Pos1, Pos2,Pos3: byte;
     s, SubStr: string;
begin
s := '<div class="H1"><a href="/s/RubD16E1F55D21144C4AE3F9DDF52B6E1D9/Doc~E9E3E544B0814490A9D64596C57269FAB~ATpl~Ecommon~Scontent.html">Bahn bestellt 137 Doppelstockwagen</a></div>';
Pos1 := PosEx('"H1">', s)+5;      // weil der Suchstring 5 Zeichen hat
if Pos1 <> 0 then // überschrift gefunden
begin
  Pos2 := PosEx('>', s, Pos1 + 1)+1;   // weil der Suchstring 1 Zeichen hat

  Pos3 := PosEx('<', s, Pos2);
  if Pos2 <> 0 then
    SubStr := Copy(s, Pos2, Pos3-Pos2); // Aufparameter von copy mal anschauen

  ShowMessage(SubStr + '');
end;
end;
Grüße
Klaus

Chris1896 12. Jan 2011 13:34

AW: Überschrift aus Textdatei finden.
 
Aber dann kann ich es doch auch so zusammenfassen oder nicht?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Pos1, Pos2,Pos3: integer;
     s,s2: string;
begin
s := '<div class="H1"><a href="/s/RubD16E1F55D21144C4AE3F9DDF52B6E1D9/Doc~E9E3E544B0814490A9D64596C57269FAB~ATpl~Ecommon~Scontent.html">Bahn bestellt 137 Doppelstockwagen</a></div>';
Pos1 := Pos('"H1">', s);
if Pos1 <> 0 then // überschrift gefunden
begin
  Pos2 := PosEx('>', s, Pos1+5);
  Pos3 := PosEx('<', s, Pos2);
  if Pos2 <> 0 then
    s2 := Copy(s, Pos2+1, Pos3-Pos2-1);
    ShowMessage(s2 + '');
  end;
end;

Deep-Sea 12. Jan 2011 13:35

AW: Überschrift aus Textdatei finden.
 
@Klaus01:
Dein Code hat Fehler. Du addierst zu den Positionsvariablen erst einen Offset und prüfst dann, ob sie Null sind. Dies tritt aber nie ein, auch wenn der Teilstring nicht gefunden wurde, da z.B. 0 + 5 immer <> 0 ist :wink:


@Chris1896:
Ja, sieht ganz gut aus. Geht es denn nun?

[edit]
Sicher, dass du ShowMessage ausführen willst, auch wenn Pos2 nicht gefunden wurde?
Oder anders: der Code ist falsch/schlecht eingerückt.

Chris1896 12. Jan 2011 13:40

AW: Überschrift aus Textdatei finden.
 
@ Deep-Sea ja, funktioniert. werde jetzt mal weiter ausprobieren und wenn ich wieder nicht weiter komme Frage ich hier einfach wieder nach.

Danke an alle für die Hilfe

Chris1896 12. Jan 2011 13:45

AW: Überschrift aus Textdatei finden.
 
Ach eine Frage fällt mir da noch ein, kann ich diesen Quelltext jetzt so umbauen das ich eine Schleife draus machen kann? Ist ja sonst ein bisschen lang das ganze und wohl auch nicht so zielführend.

DeddyH 12. Jan 2011 14:01

AW: Überschrift aus Textdatei finden.
 
Klar kannst Du.


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