Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   .html Datei zeilenweise lesen (https://www.delphipraxis.net/172415-html-datei-zeilenweise-lesen.html)

af99 2. Jan 2013 15:29

Delphi-Version: 5

.html Datei zeilenweise lesen
 
Hallo Zusammen,

ich habe mal wieder ein Problem mit Strings bzw. Text. Ich möchte eine .html Datei zeilenweise lesen und nach bestimmten Texten suchen. Die Datei ist mal wieder irgendwie codiert und der Text wird nicht erkannt.

Delphi-Quellcode:
var
  errortext: string;

AssignFile(rein, datei);
reset(rein);
errortext := 'test1';
repeat
   readln(rein, s);
   //showmessage(s);
   if ansipos('<TR class=', s) > 0 then
    repeat
       readln(rein, s);
       readln(rein, s);
       if pos('Missed', s) > 0 then
         errortext := 'test2';
       if pos('Failed', s) > 0 then
         errortext := 'test3';
       readln(rein, s);
       readln(rein, s);
       readln(rein, s);
       readln(rein, s);
       readln(rein, s);
       readln(rein, s);
     until ansipos('</TD></TR>', s) > 0;
   until eof(rein);
   CloseFile(rein);
   ShowMessage(errortext);
in der Variabke errortext steht aber immer der Text "test1" also werden die if Pos... nicht gefunden. Auch wenn ich mir mit Showmessage den Inhalt von s anzeigen lasse wird das Fenster abhängig vom Text größer und kleiner. Der Text wird jedoch nicht angezeigt.

Hier dann noch die ersten Zeichen in der .html Date1

Code:
in HEX
FF FE 3C 00...

in DEZ
ÿþ<
Wie muss ich hier denn was umwandeln damit ich die Zeichen aus der Datei in den IF's vergleichen kann und wie um diese an der Console auszugeben.

Vielen Dank für Eure Hilfe.
Andreas

Mavarik 2. Jan 2013 15:33

AW: .html Datei zeilenweise lesen
 
Sicher das das eine HTML Datei ist?

af99 2. Jan 2013 15:53

AW: .html Datei zeilenweise lesen
 
ist ne .htm
Code:
<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="TSM Operational Reporting">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>TSM Operational Reporting</title>
</head>

<STYLE>
<!--
.HeaderBar {
 BORDER-RIGHT: #9fabbb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #9fabbb 1px solid; PADDING-LEFT: 10px; FONT-WEIGHT: bold; FONT-SIZE: 11pt; MARGIN-BOTTOM: 5px; PADDING-BOTTOM: 1px; BORDER-LEFT: #9fabbb 1px solid; PADDING-TOP: 1px; BORDER-BOTTOM: #9fabbb 1px solid; FONT-FAMILY: arial,verdana,sans-serif; BACKGROUND-COLOR: #bed2fc
}
.FooterBar {
 BORDER-RIGHT: #9fabbb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #9fabbb 1px solid; PADDING-LEFT: 10px; FONT-WEIGHT: bold; FONT-SIZE: 8pt; MARGIN-BOTTOM: 5px; PADDING-BOTTOM: 1px; BORDER-LEFT: #9fabbb 1px solid; PADDING-TOP: 1px; BORDER-BOTTOM: #9fabbb 1px solid; FONT-FAMILY: arial,verdana,sans-serif; BACKGROUND-COLOR: #bed2fc
}
.HeaderText {
  FONT-WEIGHT: bold; FONT-SIZE: 11pt; FONT-FAMILY: arial,verdana,sans-serif
  }
...

af99 2. Jan 2013 16:00

AW: .html Datei zeilenweise lesen
 
wenn ich das FF FE aus der Datei rauslösche dann erhalte ich das gewünschte Ergebnis.

Mavarik 2. Jan 2013 16:00

AW: .html Datei zeilenweise lesen
 
.htm .html .php .aspx

"Eigentlich" alles das selbe, ne Text Datei

Sieht nach UTF8 aus, steh aber etwas anderes drinn...?

Mavarik

Popov 2. Jan 2013 16:05

AW: .html Datei zeilenweise lesen
 
Also Html entwickelt sich natürlich weiter, aber nach meiner Kenntnis hat FF FE am Anfang der Datei keinen Sinn.

Morphie 2. Jan 2013 16:10

AW: .html Datei zeilenweise lesen
 
http://de.wikipedia.org/wiki/Byte_Order_Mark
Code:
Kodierung     hexadezimale Darstellung  dezimale Darstellung  Darstellung nach Windows-1252
UTF-16 (LE)   FF FE                     255 254               ÿþ

Mavarik 2. Jan 2013 16:15

AW: .html Datei zeilenweise lesen
 
Zitat:

Zitat von Morphie (Beitrag 1197368)
http://de.wikipedia.org/wiki/Byte_Order_Mark
Code:
Kodierung     hexadezimale Darstellung  dezimale Darstellung  Darstellung nach Windows-1252
UTF-16 (LE)   FF FE                     255 254               ÿþ

UTF8-UTF16 na war doch schon fast richtig meine Idee. :stupid:

Obwohl das nicht zur Codierung im Beispiel passt...

Morphie 2. Jan 2013 16:32

AW: .html Datei zeilenweise lesen
 
Zitat:

Zitat von Mavarik (Beitrag 1197369)
Obwohl das nicht zur Codierung im Beispiel passt...

Wobei man sich dabei offenbar gar nicht sicher ist... Offiziell darf man gar kein Charset bei UTF-16 angeben
Zitat:

Zitat von http://www.w3.org/International/questions/qa-html-encoding-declarations.de.php#utf16
In diesem Artikel wird allgemein empfohlen, die Zeichencodierung innerhalb des Dokuments anzugeben, selbst wenn sie auch im HTTP-Header angegeben ist. Die HTML5-Spezifikation verbietet allerdings gegenwärtig die Verwendung des meta-charset-Attributs oder der Pragma-Direktive zur Angabe von UTF-16. Es ist eine Diskussion im Gang, ob das so sein muss; das kann sich noch ändern. Gegenwärtig sollte man, wenn valider HTML5-Code gewünscht ist, diese Angaben nicht für UTF-16-codierte Inhalte verwenden.

Ob Sie Element-basierte Angaben verwenden oder nicht, Sie sollten sicherstellen, dass Sie immer ein BOM (byte-order mark) ganz am Anfang einer UTF-16-codierten Datei zu stehen haben. Im Effekt ist dies die Angabe innerhalb des Dokuments.


Popov 2. Jan 2013 16:35

AW: .html Datei zeilenweise lesen
 
Aus dem Artikel von Wiki:

Zitat:

Da das Zeichen U+FFFE als ungültig definiert ist
Woraus ich verstehe, dass die beiden Zeichen sowieso dazu gedacht sind allgemein ignoriert zu werden, speziell dazu gedacht sind anzuzeigen welche Kodierung es ist. Wenn du sie also löscht, wie du es gemacht hast, dann machst du anscheinend erst ein mal das Richtige. Allerdings solltest man nicht ignorieren, dass es eine UTF-16 Datei ist.

af99 2. Jan 2013 16:40

AW: .html Datei zeilenweise lesen
 
ich habe die Zeichen nur zum Test gelöscht. Wenn das Programm mal läuft dann kann ich die Zeichen nicht löschen. Ich muss also mit der Datei so auskommen wie sie ist. Gibt es denn keine Funktion zum Umwandeln ???

p80286 2. Jan 2013 16:53

AW: .html Datei zeilenweise lesen
 
Es scheint sich bei der Datei um eine Unicode (16Bit) Datei zu handeln.
Da hast du mit Delphi5 erst einmal schlechte Karten. Und mit readln und Konsorten erst recht.

Kannst du die Datei unter einem anderen Namen im ANSI-Format abspeichern? (Notepad)
Dann versuch es doch nochmal mit der Kopie.

Gruß
K-H
---- vergiß es, das kommt davon, wenn der chef stört

Popov 2. Jan 2013 17:07

AW: .html Datei zeilenweise lesen
 
Zitat:

Zitat von af99 (Beitrag 1197372)
ich habe die Zeichen nur zum Test gelöscht. Wenn das Programm mal läuft dann kann ich die Zeichen nicht löschen. Ich muss also mit der Datei so auskommen wie sie ist. Gibt es denn keine Funktion zum Umwandeln ???

Ich meinte nicht, dass du sie gleich löschen sollst, aber du kannst sie ignorieren. Was das konvertieren angeht, so dürfte das erst einmal kein Problem sein. Die Frage ist eher, ob das Ok ist. Was bringt es die Datei in 8 Bit zu konvertieren und Informationen gehen verloren. Und auch sonst, wo ist das Problem die Datei als Temp-Datei zu speichern und sie nach eigenen Bedürfnissen zu bearbeiten? Alternativ FileStream.

Schon mal was von TFileStream gehört? Die Datei laden und da bearbeiten. Für mich einfacher als das andere.

Übrigens, im umwandeln kenne ich mich weniger aus, aber wie wäre es mit AnsiToUtf8?

delnu 3. Jan 2013 00:18

AW: .html Datei zeilenweise lesen
 
Zur Umwandlung der gesamten Datei z.B. ins Ansi-Format eignet sich der Editor "Notepad++" !

Datei laden, unter dem Menüpunkt "Kodierung" sicherheitshalber prüfen, in welchem Format die Datei gespeichert ist und dann ( selber Menüpunkt ) ins Zielformat umwandeln, z.B. durch "Konvertiere zu ANSI".

Das Einlesen/Umsetzen von Unicode ist ( eingeschränkt ) auch mit alten Delphi-Versionen möglich, wenn man entsprechende Code-Tabellen in den Quelltext einfügt, die dann die jeweiligen Zeichen gegeneinander austauschen. Das funktioniert aber nur soweit es sich um Standardzeichen handelt.
Bei Gelegenheit werde ich hier mal meine Tabellen posten, muß sie aber erst raussuchen.

sx2008 3. Jan 2013 11:03

AW: .html Datei zeilenweise lesen
 
Mal so ganz grundsätzlich: mit den Funktionen Readln und AnsiPos kann man keine HTML-Datei vernünftig auslesen.
Diese Funktionen sind einfach zu begrenzt.
Das wäre ungefähr so als ob man einen Sat-Receiver nur mit einem Schraubendreher bewaffnet justieren wollte.
Man braucht einfach das richtige Werkzeug.
Für HTML wäre das ein Parser (DOM oder SAX).

Mavarik 3. Jan 2013 14:39

AW: .html Datei zeilenweise lesen
 
Zitat:

Zitat von sx2008 (Beitrag 1197442)
Mal so ganz grundsätzlich: mit den Funktionen Readln und AnsiPos kann man keine HTML-Datei vernünftig auslesen.
Diese Funktionen sind einfach zu begrenzt.
Das wäre ungefähr so als ob man einen Sat-Receiver nur mit einem Schraubendreher bewaffnet justieren wollte.
Man braucht einfach das richtige Werkzeug.
Für HTML wäre das ein Parser (DOM oder SAX).

Das sehe ich aber anders...
Über das DOM zugreifen, bedeutet auch mit allen Fehlern leben...

Mit Pos und Stringreplace den "HTML-müll" von den Daten trennen ist doch viel einfacher...

Mavarik

delnu 4. Jan 2013 21:56

AW: .html Datei zeilenweise lesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie angekündigt, habe ich mal meine früheren Tests rausgesucht.

Die ZIP-Datei "UTF_TEST.ZIP" enthält einige Testansätze vom Dezember 2009/Januar 2010 zum Auslesen bzw. Konvertieren von Dateien unterschiedlicher Textformate. Benutzt wurden Delphi 5 und die damals aktuelle Lazarus-Version. Ich habe das nicht weiter entwickelt und man möge mir eventuelle Ungereimtheiten nachsehen. Die enthaltenen Quelltexte sind nur im Hinblick auf die wesentlichen Problemstellungen kommentiert. Es werden lediglich Standardkomponenten benutzt. Es ist nicht auszuschliessen, daß die Quelltexte je nach benutzter Compilerversion angepaßt werden müssen. Die ZIP-Datei enthält ausser den vollständigen Quelltexten die EXE-Dateien der beiden Delphi-Programme. Weil Lazarus unheimlich aufbläht und darum nach wie vor eine unzumutbare Notlösung statt eines wirklich brauchbares Programm darzustellen, habe ich die ca. 12 MB große EXE-Datei des Lazarus-Beispiels entfernt.

Einzige aktuelle Änderung : Soweit in einigen Dateien mein Name und meine Anschrift enthalten waren, habe ich diese Angaben entfernt.

Die wesentlichsten in der ZIP-Datei enthaltene Dateien :
TABELLE.TXT : unvollständige Tabellenübersicht von HTML- und Unicode- Ersatzzeichen

Verzeichnis "D_TEST" : Analyse- und Konvertierungsprogramm
Beschreibung.rtf : Kurzbeschreibung der Programmfunktion
ConvTable.pas : Die ausgelagerte Konvertierungs-Unit

Verzeichnis "DELPHI" :
Optischer Vergleich verschiedener Codierungen/Konvertierungen anhand bekannter bzw. gebräuchlicher Sonderzeichen und Umlaute.
CHARSET.TXT : unkontrollierte Vergleichstabelle zu Testzwecken
UChars.pas : Die ausgelagerte UNVOLLSTÄNDIGE Vergleichstabelle ( ASCII, ANSI, UTF-8 )
UTxtConv.pas : Die ausgelagerte Konvertierungs-Unit

Verzeichnis "LAZARUS" :
Weil mich Lazarus nicht mehr sonderlich interessiert, kann ich über diesen Test nicht mehr allzuviel äussern, außer daß damit die Datei "TABELLE.INC" erzeugt werden kann.
TABELLE.INC : Durch das Programm erzeugte Include-Datei mit UTF-Tabelle der Zeichen 128 bis 255
TABELLE_1.TXT : ASCII-Zeichensatz mit Unicode-Angaben ?
TABELLE_2.TXT : ANSI-Zeichensatz mit Unicode-Angaben ?

Leider sind alle neueren/aktuellen Versionen des von mir benutzten Texteditors Notepad++ nicht mehr in der Lage, ASCII-Zeichen darzustellen, so daß ich diesbzgl. nichts mehr kontrollieren kann.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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 by Thomas Breitkreuz