Tutorial - Wetterdaten und Datenbanken - Teil 3.1 - Tabelle mit Archiv füllen

Teil 3.1 - Tabelle mit Archivdaten füllen


Wetterdaten einzeln von Hand einzupflegen, mag teilweise nötig sein, ist aber nicht sehr aufregend. Mit ein wenig php, kann man aber ganze Archive, ohne großen Aufwand in eine Datenbank übertragen.

Als Beispiel dient hier eine (Monats-) Export Datei von WsWin.


Datenquelle: Exportdateien von WsWin


Hier ein Beispiel einer (Monats)Exportdatei von WsWin:


(Beachten: Die Datenzeilen beginnen in meiner Datei erst mit Zeile 4)

Die php Datei:


Beachte: Es gibt einige Methoden für diese Aufgabe. Der hier aufgezeigte Weg ist vermutlich nicht der optimalste und schnellste, aber m.M. nach einfach nachzuvollziehen und anzupassen. Für einen einmaligen Import großer Datenmengen ist Performance auch nicht unbedingt so wichtig.


1. Die Import Datei


Zuerst die WsWin Export Datei auf den Server laden. (z.B. EXP201311A.CSV)



2. Die php Datei


Wir erstellen zuerst ein php Script, welches den Inhalt unserer WsWin Datei mit echo anzeigt.
Eine php Datei mit folgendem Inhalt erstellen, und auf den Server laden:

(Die Variablen $dateiname und $startzeile an Ihre Exportdatei anpassen).

<?php

//Dateiname der Importdatei
$dateiname = "EXP201311A.CSV";

//Anzahl Anfang Zeilen überspringen
$startzeile = 4;


//Die Import Datei öffnen
if (($handle = fopen("$dateiname", "r")) !== FALSE) 
{

  //zeilenzähler auf 0
  $counter = 0;

  //Jede Zeile abarbeiten
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
  {

    //counter rauf
    $counter++;

    //die ersten zeilen überspringen
    if($counter >= $startzeile) 
    {

      //das echo (ausgabe)
      echo $data[0].", ".$data[1].", ".$data[3].", ".$data[10]. ", ".$data[11]."<br>\n";
   

    }
   
  }

  //Import Datei schliessen
  fclose($handle);
}
?>


Wird diese php Datei im Browser geöffnet, sollten Inhalte der Import Datei etwa so angezeigt werden:

Beachte: Datum/Zeit Format und evtl. falsche Spalten

Vermutlich werden aber noch nicht alle benötigten Felder richtig ausgegeben und das Datumformat stimmt auch nicht.


3. Die richtigen Felder ausgeben


Die Spaltennummern sind aber vermutlich nicht bei allen Benutzern gleich wie bei mir.
Im echo Teil des Scripts wird das array "$data" ausgegeben. Die Zahlen in den [] Klammern dahinter, entsprechen der Reihenfolge der Spalten in der Importdatei.

echo $data[0].", ". $data[1].", ".$data[3].", ".$data[10]. ", ".$data[11]."<br>\n";

(Das Datum ist bei mir in Spalte [0], Zeit in Spalte [1], Temperatur in Spalte [3] etc.)


4. Das Datum formatieren:


Für die Datenbank benötigen wir das Datum im Format "2013-11-25 00:00"

Wir zerlegen das Datum und die Zeit der Import Datei und bauen diese in den Variablen $d1 wieder zusammen.

$splitDate = explode(".", $data[0]);  //Das Datum zerlegen 
$splitTime = explode(":", $data[1]);  //Die Zeit zerlegen


//Das Datum für Spalte datetime (2013-11-25 00:00)
$d1 = $splitDate[2]."-".$splitDate[1]."-".$splitDate[0]." ".$splitTime[0].":".$splitTime[1];


Das echo entsprechend anpassen. Zuerst das Datum $d1, dann wieder die Werte der Spalten:

echo $d1.", ".$data[3].", ".$data[10]. ", ".$data[11]. "<br>\n";


Unsere php Datei sollte nun folgenden Inhalt haben:

<?php

//Dateiname der Importdatei
$dateiname = "EXP201311A.CSV";

//Anzahl Anfang Zeilen überspringen
$startzeile = 4;


//Die Import Datei öffnen
if (($handle = fopen("$dateiname", "r")) !== FALSE) 
{

  //zeilenzähler auf 0
  $counter = 0;

  //Jede Zeile abarbeiten
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
  {

    //zeilenzähler rauf
    $counter++;

    //erst ab dieser Zeile ausgeben
    if($counter >= $startzeile) 
    {

   
   // datum und Zeit zerlegen und neu zusammenbauen
   $splitDate = explode(".", $data[0]);
   $splitTime = explode(":", $data[1]);

   $d1 = $splitDate[2]."-".$splitDate[1]."-".$splitDate[0]." ".$splitTime[0].":".$splitTime[1] ;
   
   

     //das echo (ausgabe)
     echo $d1.", ".$data[3].", ".$data[10]. ", ".$data[11]."<br>\n";
   

    }
   
  }

//Import Datei schliessen
fclose($handle);
}
?>


5. Die Ausgabe kontrollieren:




Jetzt sieht die Sache schon besser aus.


6. Vom echo zum SQL-Insert


Statt die Daten nur auszugeben, wollen wir sie jetzt in die Datenbank Tabelle importieren. Zuerst die Datenbank Verbindung am Anfang des Scripts.

//db verbindung
$link = mysqli_connect("Hostname", "Username", "Password", "DBname");
(Mit Ihren Zugangsdaten ersetzen)


Wir erinnern uns an den SQL-Insert Befehl in Teil 3:

$query = "
INSERT INTO wettertabelle 
(`datetime`,`temp`,`hum`,`pressure`) 
VALUES
('2013-11-25 00:05:00','11.9','87','999.4')
";


Die Wetterdaten nach "VALUES" mit unseren Variablen (aus dem echo) ersetzen:

$query = "
INSERT INTO wettertabelle 
(`datetime`,`temp`,`hum`,`pressure`) 
VALUES
('$d1','$data[3]','$data[10]','$data[11]')
";

mysqli_query($link,$query);


7. Zusammenfassung:


Hier nochmals das ganze Script:

<?php

//Dateiname der Importdatei
$dateiname = "EXP201311A.CSV";

//Anzahl Anfang Zeilen überspringen
$startzeile = 4;


//db verbindung
$link = mysqli_connect("Hostname", "Username", "Password", "DBname");


//Die Import Datei öffnen
if (($handle = fopen("$dateiname", "r")) !== FALSE) 
{

  //zeilenzähler auf 0
  $counter = 0;

  //Jede Zeile abarbeiten
  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
  {

    //counter rauf
    $counter++;

    //erst ab dieser Zeile ausgeben
    if($counter >= $startzeile) 
    {

   
   // datum und Zeit zerlegen und neu zusammenbauen
   $splitDate = explode(".", $data[0]);
   $splitTime = explode(":", $data[1]);
   
   $d1 = $splitDate[2]."-".$splitDate[1]."-".$splitDate[0]." ".$splitTime[0].":".$splitTime[1] ;
   


   //das echo (ausgabe)
     echo $d1.", ".$data[3].", ".$data[10]. ", ".$data[11]."<br>\n";
   
   
   //die db query
   $query = "
   INSERT INTO wettertabelle 
   (`datetime`,`temp`,`hum`,`pressure`) 
   VALUES
   ('$d1','$data[3]','$data[10]','$data[11]')
   ";
   
   //db query noch ausführen
   mysqli_query($link,$query);
   

    }
   
  }

//Import Datei schließen
fclose($handle);
}
?>

Wird diese Datei nun im Browser geöffnet, wird jede Zeile einzeln in die Datenbank importiert. Sie können die neuen Einträge in phpMyAdmin unter "Anzeigen" kontrollieren.

(Die echo Ausgabe können Sie auch entfernen, Sie wird für den Import nicht benötigt.)





(Optional) Mehrere Dateien Importieren


Je nach Umfang der Archive kann es komfortabel sein, mehrere WsWin Monatsdateien auf einmal zu importieren. Sie können dazu das php Script leicht ändern, um ein ganzes Verzeichnis abzuarbeiten.

Vorsicht: Dieses, für große Datenmengen nicht optimale Script, verursacht für einige Sekunden eine hohe Server Auslastung. (Da es jede Zeile einzeln importiert!) Ich würde daher, nicht mehr als ein Jahr auf einmal importieren.


1. Wir ändern zuerst die Variable $dateiname in $dateiordner:

Folgender Bereich ...
//Dateiname der Importdatei
$dateiname = "EXP201311A.CSV";

... ersetzen mit: (Verzeichnisname anpassen):
//Ordner mit Importdateien
$dateiordner = "importdateien";




2. Mit scandir wird neu das Verzeichnis ausgelesen und die Dateinamen im array "$allFiles" abgelegt. Und dann mittels einer foreach-Schleife jede Datei einzeln abgearbeitet:

Folgender Bereich ...
//Die Import Datei öffnen
if (($handle = fopen("$dateiname", "r")) !== FALSE) 
{

.... ersetzen mit:
//verzeichnis scannen und dateinamen in array speichern
$allFiles = scandir($dateiordner);

//die foreach schleife
foreach ($allFiles as $dateiname) { 
 
//jetzt wie bisher die Datei öffnen
if (($handle = fopen("$dateiordner/$dateiname", "r")) !== FALSE) 
{
(Klammern nicht vergessen!)



3. Dann noch am Ende des Scripts, die foreach Schleife mit } schließen:

Folgender Bereich ...
//Import Datei schliessen
fclose($handle);
}

... ersetzen mit:
//Import Datei schliessen
fclose($handle);
}
}



Weiter mit Teil 3.2 - Livedaten importieren (wswin)

Keine Kommentare:

Kommentar veröffentlichen