CSV Daten von einen Webserver in eine Datenbank des Webhoster schreiben?

Boy2006

Banned
Thread Starter
Mitglied seit
06.10.2008
Beiträge
4.821
Also einige öffentliche Stellen bieten kostenlos (ja ich weis Lizenzblabla...) "Echtzeitdaten" an.
Die frage ist also wie macht man das am besten?
Das startet mal mit den Download. Das Problem ist auf der Homepage stehen "irgendwelche" Daten wann es upgedatet worden ist nicht mal der Tag stimmt.
Gut wie kann man feststellen wann die Datei erzeugt wurde? Beim FTP steht es ja dabei aber als "Download"?

Gut nächster Schritt die Daten haben alle unterschiedliche Formate je nach Stadt, Bezirk und Bundesland. :mad:
Die unterscheiden sich total. Das heist man muss die mal lokal "bearbeiten" und das heraus holen was wichtig ist.

Wenn alles "ordentlich" aufgearbeitet wurde muss man es "nur" mehr hochladen.

Klingt ja alles einfach aber ich habe 0 ideen wie man das machen kann.
Ich schätze mal ein Webserver wird dazu nicht ausreichen?
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Also ich habe sowas ähnliches mal mit Python, BeautifulSoup (hatte allerdings HTML-Daten und keine CSV, vielleicht gibts da was besseres) und sqlite realisiert.
Dann musst du eben für jedes Stadt/Bezirk/Bundesland Beautifulsoup zurechtschneiden und in ein gemeinsames Datenformat (für die Datenbank) überführen.

Mit einem Webserver kannst du die Daten dann anderen zur Verfügung stellen, das Python-Programm sollte dann aber wohl auf einem VServer (o. ä.) laufen.
 
Zuletzt bearbeitet:
Ich würde es halt zuhause rennen lassen. Mir schenk jemand paar Blade Server mit ordentlich Power. Das Chassy ist ned so teuer bestelle ich mir dann nächstes We.
Ich habe 0 ahnung davon. Kannst du mir helfen sowas zum laufen bekommen?
 
kannst du mir erklären, wozu du für dieses Problem, wenn du nicht weißt, wie du anfangen willst, "Blade Server mit ordentlich Power" brauchst?
 
Weil auf den paar Programme laufen werden für die meine Rechner einfach zu langsam sind.
Und ich bekomme sie geschenkt von jemanden der die dinger einfach in die Recycling Tonne stecken wollte.
 
Selbst wenn es 1.000.000 Datensätze sein sollten, sowas ist innerhalb 5 Minuten importiert...
 
Die frage ist wie?
Ich habe keine ahnung wo man bei sowas anfangen könnte.
 
Darf ich mal einen Beispieldatensatz sehen? Mit PHP kann ich das recht leicht realisieren.
 
https://www.data.gv.at/katalog/dataset/998d1ecb-945a-4442-8127-7b491427d52c
https://www.data.gv.at/katalog/dataset/97052045-1199-49e5-a623-509c90b199b8
https://www.data.gv.at/katalog/dataset/933f78e6-9d1c-4953-9d9e-99ca7669ebd2
https://www.data.gv.at/katalog/dataset/8b057f32-1312-40ae-ae51-9aa0a0d372ca
https://www.data.gv.at/katalog/dataset/7810e5a6-88c3-4a69-b7bd-5e69de753b88
https://www.data.gv.at/katalog/dataset/16dd490b-1ec3-4274-8da9-c6371613f241
https://www.data.gv.at/katalog/dataset/f9e40f30-8ac6-43e2-9ee7-f72b712ea9e1
https://www.data.gv.at/katalog/dataset/1624683e-c93c-4ab1-86f5-0f5eea8a1bcd
https://www.data.gv.at/katalog/dataset/46e591f0-563b-4bdd-bbbd-13b92250edf9
https://www.data.gv.at/katalog/dataset/0b0739c9-ebff-44f8-aa58-fae261463926
https://www.data.gv.at/katalog/dataset/bad388c1-e13f-484d-ba51-331a79537f5f
https://www.data.gv.at/katalog/dataset/2646025c-8ab9-4850-b76c-c2f508b34798
https://www.data.gv.at/katalog/dataset/1acd5fbf-1f85-4692-847c-45fb2fb0606c
https://www.data.gv.at/katalog/dataset/5459cb0a-8cc3-4056-8717-c60febeafded
https://www.data.gv.at/katalog/dataset/e454bf6a-3321-4a86-998a-af61123eb056
https://www.data.gv.at/katalog/dataset/6772e22a-a364-47df-9cf7-0590fdde1757
https://www.data.gv.at/katalog/dataset/44720e90-c2de-497b-8162-3810206dd011
https://www.data.gv.at/katalog/dataset/d431f18e-3030-4dc8-801a-bbde1fa73cc3
https://www.data.gv.at/katalog/dataset/9b40a0af-a6fe-47ff-9624-2ea8f40c746f
https://www.data.gv.at/katalog/dataset/f2bb4f42-2c40-4c9d-890b-c2b3061bfe5a
https://www.data.gv.at/katalog/dataset/55729a59-299c-4f94-9e17-1fa778994653
 
Ungetestet, weil müde und keinen MySQL-Server installiert. Aber sollte mit den Daten aus dem ersten Link funktionieren. Zweifelsohne muss das aber für die anderen Links angepasst werden, sonst klappt das nicht.

Code:
#!/usr/bin/env php
<?php declare(strict_types = 1);

class App
{
    /**
     * @var PDO|null PDO database instance or null
     */
    private $dbInstance = null;

    /**
     * Einstiegspunkt der App, sowas ähnliches wie die main() anderer Sprachen.
     *
     * @return int Statuscode
     */
    public function run(): int
    {
        try {
            $fileContent = $this->getFileContent();

            $fileContent = $this->normalize($fileContent);

            $importData = $this->csvToArray($fileContent);

            $importData = $this->processData($importData);

            foreach ($importData as $row) {
                $this->import($row);
            }

            return 0;
        } catch (Exception $e) {
            return $e->getCode();
        }
    }

    /**
     * Holt sich die CSV und schmeißt sie in einen String.
     *
     * @return string File content
     */
    private function getFileContent(): string
    {
        $fileContent = file_get_contents(
            'http://open-data.noe.gv.at/BD4/Kohlenmonoxid.csv'
        );

        if (!$fileContent) {
            throw new Exception('Cannot download file', 5);
        }

        return $fileContent;
    }

    /**
     * Konvertiert dir deine Datei in UTF-8 und mit UNIX-Zeilenendungen.
     *
     * @param string $fileContent File to normalize
     * @return string Normalized file
     */
    private function normalize(string $fileContent): string
    {
        if (!mb_check_encoding($fileContent, 'UTF-8')) {
            $fileContent = mb_convert_encoding($fileContent, 'UTF-8', 'ISO-8859-1');
        }

        $fileContent = trim($fileContent);

        $fileContent = str_replace("\r\n", "\n", $fileContent);
        $fileContent = str_replace("\r", "\n", $fileContent);

        return $fileContent;
    }

    /**
     * Konvertiert dir deine CSV in ein Array, damit man besser damit arbeiten kann.
     *
     * @param string $fileContent File to convert
     * @return string Converted file
     */
    private function csvToArray(string $fileContent): array
    {
        foreach (explode("\n", $fileContent) as $element) {
            $results[] = str_getcsv($element, ';', "'");
        }
        return (isset($results)) ? $results : [];
    }

    /**
     * Diese Funktion kannst du nutzen, um die Dateien noch in irgendeiner
     * Form zu bearbeiten. Mal noch löscht sie nur das erste Element des
     * Arrays, da da nur der Kopf der CSV drin ist.
     *
     * @param array $data Data to process
     * @return array Processed data
     */
    private function processData(array $data): array
    {
        array_splice($data, 0, 1);
        return $data;
    }

    /**
     * Schreibt dir alle in dem Array enthaltenen Daten in die DB.
     *
     * @param array $importData Data to import
     */
    private function import(array $importData)
    {
        $instance = $this->getDBInstance();
        $estimatedElements = 27;

        if (count($row) != $estimatedElements) {
            throw new Exception(
                'Count of elements in row != ' . $estimatedElements,
                8
            );
        }

        $questionMarks = implode(',', array_fill(0, $estimatedElements, '?'));

        $stmt = $instance->prepare(
            'INSERT INTO tabelle VALUES (' . $questionMarks . ')'
        );
        $stmt->execute($row);
    }

    /**
     * Gibt dir ne PDO-Instanz zurück, mit der du deine Querys abfeuern kannst.
     *
     * @return PDO PDO database instance
     */
    private function getDBInstance(): PDO
    {
        if (is_null($this->dbInstance)) {
            $host     = '127.0.0.1';
            $port     = 3306;
            $database = 'datenbank';
            $user     = 'user';
            $password = 'pass';

            $this->dbInstance = new PDO(
                sprintf(
                    'mysql:host=%s;port=%d;dbname=%s',
                    $host,
                    $port,
                    $database
                ),
                $user,
                $password,
                array(
                    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
                )
            );

            $this->dbInstance->setAttribute(
                PDO::ATTR_ERRMODE,
                PDO::ERRMODE_EXCEPTION
            );
        }

        return $this->dbInstance;
    }
}

$app = new App;
exit($app->run());
 
Zuletzt bearbeitet:
oke ich habe keine ahnung von was.
Aber wie funktioniert das man die Daten:
1) Runter ladet
2) "Normalisiert"
3) Importiert
4) Auswertet?
 
Richtig ich habe 0 ahnung davon.
Was immer ein Problem ist wenn man verschiedene Daten hat die sich unterscheiden.
 
Dann haben wir ab hier eh ein Problem. Und dann wirst du dich wohl damit beschäftigen müssen, ob du willst oder nicht. Das ist nun mal leider eine Aufgabe, die man nur mit einer Scriptsprache ordentlich lösen kann. Und wenn ich dir das jetzt auf all die anderen Links anpasse, dann geht für mich der gesamte Tag flöten. Plus: Ich bin mir sicher, dass noch weitere Fragen aufkommen werden. Und eine davon wird sein: "Wie führe ich das jetzt aus?" Vor Allem dein Punkt 4, "auswerten". Was willst du an den Daten auswerten? Ne wirklich ausführliche "Auswertung" nimmt möglicherweise auch mal 1-2 Wochen Code schreiben in Anspruch. Aber zumindest eine Sorge kann ich dir nehmen: Das Script läuft schneller durch als du gucken kannst. Keine Ahnung was du mit den Bladeservern vor hattest, aber selbst ein Raspberry Pi kriegt sämtliche Daten aus den Links, die du da gepostet hast, in unter einer Sekunde importiert.
 
Allem dein Punkt 4, "auswerten". Was willst du an den Daten auswerten?
Ja die Daten ändern sich ja einmal die Stunde. Da muss man die Daten herunterladen.
Dann eben normalisieren. Die Files sehen ja alle unterschiedlich aus. Manche sind nur untereinander mache sind eben von Links nach Rechts und und und. So gut wie alle Städte haben CSV übergreifende Daten die man natürlich zusammen führen muss. DAS meinte ich mit kompliziert!
Die Daten können sich ständig ändern da muss man alles Dynamisch gestalten und nicht statisch.
 
Gut, dann sind das Aufwände, die sich nicht "mal eben" realisieren lassen. Du wirst dann nicht drum herum kommen dich auch mit diversen Scriptsprachen auseinanderzusetzen. Da läge dann z.B. PHP nahe.
 
Wie kann man diese Daten runterladen und auswerten?!
 
Nicht viel anders als die CSV. Man erspart sich halt nur das Konvertieren der CSV in ein Array, denn ein JSON ist eigentlich schon mehr oder weniger eine Art Array.
 
Naja das schlimme ist halt wie man die daten zusammen führen kann.
 
Ich fürchte, dass du a) programmieren lernen musst oder b) jemanden findest, der es für dich macht :)
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh