Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Auslesen einer csv.html (https://www.delphipraxis.net/183356-auslesen-einer-csv-html.html)

Paulman 5. Jan 2015 11:39

Auslesen einer csv.html
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo und ein gesundes neues Jahr!

Ich habe folgendes Problem.
Ein IPswitch sendet ein paar Messdaten an die eigene Seite csv.html welche ohne Login ausgelesen werden kann.
Die Daten werden im Bereich von wenigen Millisekunden aktualisiert.
Nun möchte ich in zyklischen Abständen die Daten lesen und als String in eine eigene csv-Datei speichern.
Brauchen tue ich eigentlich nur die Werte 16 und 19, aber das ist ja erst mal Nebensache.

Der Hersteller stellt auch ein einfaches PHP Script mit Erläuterung zur Verfügung,
leider habe ich keinen Plan dies in Delphi umzusetzen.

Vielen Dank schon mal für eure Hilfe.


Delphi-Quellcode:
<?php
        $st=  file_get_contents( "http://192.168.2.10/csv.html" );   // web-Seite einlesen
        echo "<br>".$st."<br>";                                                    // Inhalt als String ausgeben
        $sta= explode( ",", $st, 100 );                                           // String in Array wandeln mit Trennzeichen Komma, bis zu 100 Elemente
        print_r ($sta);                                                                    // komplettes Array ausgeben
     echo "<br>Abstand gefiltert= ".$sta[26]."cm<br>";            // 26.Element ist hier bei einem    IPswitch-SG.1 der Abstand eines SB.cm-Moduls
    ?>

mkinzler 5. Jan 2015 11:54

AW: Auslesen einer csv.html
 
Einfach mit verwendeter Netzwerkbibliothek Laden:

z.B. Indy
Delphi-Quellcode:
csv := idHTTP1.Get( 'http://192.168.2.10/csv.html');

Paulman 5. Jan 2015 21:16

AW: Auslesen einer csv.html
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Markus,

vielen Dank für den Tipp, hat schon mal prima funktioniert.
Das Ergebnis ist allerdings, dass der komplette Inhalt als String geladen wird (siehe Bild)
Nun habe ich aber das Problem die entsprechend wichtigen Daten herauszufiltern.

Ich habe den String zum Array umgewandelt, bekomme aber je nach Abfrage nur das jeweilige Zeichen des ausgewählten Arrays.
Wie deklariere ich das Array um die einzelnen Werte des body (Kommagetrennt) zu erhalten? :gruebel::gruebel:

mkinzler 5. Jan 2015 21:28

AW: Auslesen einer csv.html
 
Ich hätte hier keine HTML-Datei erwartet.
Wir müssen erst mal die Tags loswerden.

Delphi-Quellcode:
var
  p, p2: PAnsiChar;
  s, csv: string;
  sl: TStrings;
begin
  s := idHTTP1.Get( 'http://192.168.2.10/csv.html');
  p := Pos( '<body>', s)+7;
  p2 := PosEx( '</body>', s, p);
  csv := Copy( s, p, p2-p);
  sl := TStringList.Create;
  sl.StrictDelimiter := True;
  sl.CommText := csv;
  ..
  Caption := sl[2];
  ..
  sl.Free;
  ...

himitsu 6. Jan 2015 03:30

AW: Auslesen einer csv.html
 
In Diesem Fall funktioniert dessen Beispiel-PHP aber auch nicht.
http://php.net/manual/de/function.strip-tags.php (solche Funktionien gibt es nicht nur in PHP)

http://192.168.2.10/csv
http://192.168.2.10/csv.txt
http://192.168.2.10/csv.csv

Sowas geht nicht?



Wende dich mal an den Hersteller, denn wenn da wirklich HTML raus kommt, dann ist das definitiv ein Bug.
Wobei es ja eigentlich HTML heißt und somit stimmt. :stupid:

Entweder es gibt noch einen anderen Weg, das als "richtiges" CSV rauszubekommen und/oder seine Demos sind schrott.
So ist die Ausgabe erstmal (ohne Vorverarbeitung/Filterung) nicht benutzbar.

Paulman 6. Jan 2015 10:06

AW: Auslesen einer csv.html
 
Vielen Dank für den Code.

StrictDelimiter kennt mein Delphi 7 nicht, es geht aber auch ganz ohne. Wozu ist diese Anweisung?
Übrigens musste ich noch etwas ändern, p, p2: PAnsiChar in integer, da sonst inkompatible Typen,
und commtext ist sicherlich commatext?
Auf jedem Fall war die Antwort schon mal sehr hilfreich, damit komme ich jetzt klar.

Übrigens hier mal die Infoseite des Herstellers: http://www.sms-guard.org/dfuaips.htm

Wenn der IPswitch Internetzugang hat kann man auch für wenig Geld deren Server nutzen. Der Switch schreibt dann eigenständig in die Datenbank.
Ein Projekt wäre dann sicherlich auch den Netzwerkverkehr mitzulesen und eine eigene Lösung zu basteln, das geht mir aber jetzt eh zu weit.

Nochmals Dank und einen schönen Tag!
Paulman

mkinzler 6. Jan 2015 10:35

AW: Auslesen einer csv.html
 
Der Strictdelimiter sorgt dafür, dass nur angegebene Trenner verwendet wird (Komma bei CommaText); so führen z.B. auch im Text enthaltene Leerzeichen zur Trennung.

Paulman 6. Jan 2015 10:38

AW: Auslesen einer csv.html
 
Alles klar, danke!

Perlsau 6. Jan 2015 10:45

AW: Auslesen einer csv.html
 
Zitat:

Zitat von Paulman (Beitrag 1285539)
Auf jedem Fall war die Antwort schon mal sehr hilfreich, damit komme ich jetzt klar.

Ein Problem, das ich seit damals, als ich mich das erste Mal damit befaßt hatte, nicht vergessen habe: Die CSV-Datei muß korrekt sein. Das heißt, wenn die CSV-Datei in einer Spalte weniger Felder hat als erwartet, kommt es unweigerlich zu einem Access-Error, da die abgefragte – letzte – Spalte nicht existiert. Man kann das abfangen, indem man vor dem Abfragen der Delimiter-Stringlist deren Count-Eigenschaft prüft. Dann weiß man schonmal, ob auch alle erwarteten Felder enthalten sind.


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