Tutorial - Wetterdaten Diagramme mit amcharts - Teil 2.2 - Textdateien CSV

Teil 2.2 - Textdateien CSV



Achtung: Neue und aktualisierte Versionen der Tutorials finden Sie hier:

http://www.pscl.ch



.csv Dateien lassen sich auf verschiedene Arten einbinden. Hier wird eine flexible PHP Variante vorgestellt, falls Datum und Werte umformatiert werden müssen.




1. Beispiel Quelldatei:


z.B. "data.csv"

01.11.2013;00:00;26.0;88;1000.5
01.11.2013;00:05;26.0;82;1000.6
01.11.2013;00:10;25.9;85;1000.7
01.11.2013;00:15;25.5;87;1000.2
...




2. Das PHP Script


Um diese Datei in ein vom amchart lesbares Format umzuwandeln, verwenden wir ein PHP Script welches ähnlich aufgebaut ist, wie das Datenbank Import Script aus Teil 3.1:


<?php

//Dateiname der Importdatei
$dateiname = "data.csv";

//Start Datenzeile der Importdatei
$startzeile = 1;


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

  //2 zähler
  $lcin = 0;
  $lcout = 0;

  //Jede Zeile abarbeiten (Hier das csv Trennzeichen anpassen ";")
  while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
  {

    //zeilenzähler Importdatei erhöhen
    $lcin++;

    //importdatei zeilen überspringen
    if($lcin >= $startzeile) 
    {
    
    //kein komma in Ausgabe Zeile 1
    if ($lcout != 0)
    {
       echo ", \n";
    }
    //komma ab zeile 2
    $lcout = 1;
   
   // datum und Zeit zerlegen 
   //Spalten $data[0][1] und Trennzeichen anpassen ". :")
   $splitDate = explode(".", $data[0]);
   $splitTime = explode(":", $data[1]);
   
   // Datum und Zeit neuen Variablen zuweisen
   // Variablen zuweisen (Spalten anpassen: "splitDate[0][1][2]")   
   $csvYear = $splitDate[2];
   $csvMonth = $splitDate[1];
   $csvDay = $splitDate[0];
   $csvHour = $splitTime[0];
   $csvMinute = $splitTime[1];
   
   // Timestamp erstellen
   $ts = strtotime("$csvYear-$csvMonth-$csvDay $csvHour:$csvMinute");
   
   // Ein Timestamp lässt sich einfacher formatieren. zb. "2013-11-25 00:00"
   // $jsDate2 = date('"Y-m-d H:i"', $ts);

   
   // Date Format erstellen (js date object). zb. "new Date(2013,10,25,0,0)"

   $jsYear = date('Y', $ts); // 2013
   $jsMonth = date('n',$ts)-1; // 10 (js month start with 0)
   $jsDay = date('j', $ts); // 25 (ohne führende null)
   $jsHour = date('G', $ts); // 0 (ohne führende null)
   $jsMinute = intval(date('i', $ts)); // 0 (ohne führende null)

   $jsDate = "new Date($jsYear,$jsMonth,$jsDay,$jsHour,$jsMinute)";
   

   //Werte mit komma als Dezimalzeichen sollten auf punkt geändert werden mit
   //$data[2] = str_replace(",", ".", "$data[2]");


   // Ausgabe Datenzeile für amcharts "new Date(2013,10,25,0,0),t:1.0,etc)
   // Spalten an Werte anpassen z.b Temp in Spalte 3 "$data[2]"

   echo "{date: $jsDate,t:".$data[2].",h:".$data[3].",p:".$data[4]."}";

    }
   
  }

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


Das Script sollte folgendes ausgeben:

{date: new Date(2013,10,1,0,0),t:26,0,h:88,p:1000.5}, 
{date: new Date(2013,10,1,0,5),t:26,0,h:82,p:1000.6}, 
{date: new Date(2013,10,1,0,10),t:25,9,h:85,p:1000.7}, 
{date: new Date(2013,10,1,0,15),t:25,5,h:87,p:1000.2}






7 Kommentare:

  1. Hallo Fredy,
    ich hab mir folgendes Templet in Wswin angelegt:


    %templatebegin%%unit_off%%alwaysseppoint_on% %ws_day2%.%ws_month2%.%ws_year%; %ws_hour2%:%ws_minute2%; %curval[2]%; %curval[18]%; %curval[33]%

    Die Ausgabe siehr folgend aus :

    25.01.2014; 16:30; 2.7; 92; 1014.6
    25.01.2014; 16:33; 2.7; 93; 1014.6
    25.01.2014; 16:36; 2.7; 93; 1014.4

    Nach dem Script sieht es dann so aus:

    {date: new Date(2014,0,25,16,15),t:3.0,h:92,p:1015.0},
    {date: new Date(2014,0,25,16,18),t:2.9,h:92,p:1014.8},
    {date: new Date(2014,0,25,16,21),t:2.9,h:92,p:1014.7},
    {date: new Date(2014,0,25,16,24),t:2.8,h:92,p:1014.8},
    {date: new Date(1970,0,1,1,0),t:,h:,p:},
    {date: new Date(1970,0,1,1,0),t:,h:,p:} ];

    Ich verstehe nicht wie in den beiden letzten Datensätzen das Jahr 1970 hinkommt.
    Vieleicht hast Du eine Idee, was ich da falsch mache.
    Viele Grüße und schon mal Danke.
    Hans

    AntwortenLöschen
    Antworten
    1. Hallo Hans

      Sind da evtl. leerzeilen in der datei ?

      Löschen
    2. Versuche mal leere zeilen auszuschliessen.

      Folgende Zeile ändern:
      f($lcin >= $startzeile)
      auf
      if($lcin >= $startzeile OR $data[0] != "")

      Löschen
    3. Hallo Fredy,

      leider kein Erfolg. Hab gier mal die PHP datei:

      var chartData = [ = $startzeile OR $data[0] != "")
      {

      //kein komma in Ausgabe Zeile 1
      if ($lcout != 0)
      {
      echo ", \n";
      }
      //komma ab zeile 2
      $lcout = 1;

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

      // Datum und Zeit neuen Variablen zuweisen
      // Variablen zuweisen (Spalten anpassen: "splitDate[0][1][2]")
      $csvYear = $splitDate[2];
      $csvMonth = $splitDate[1];
      $csvDay = $splitDate[0];
      $csvHour = $splitTime[0];
      $csvMinute = $splitTime[1];

      // Timestamp erstellen
      $ts = strtotime("$csvYear-$csvMonth-$csvDay $csvHour:$csvMinute");

      // Ein Timestamp lässt sich einfacher formatieren. zb. "2013-11-25 00:00"
      // $jsDate2 = date('"Y-m-d H:i"', $ts);


      // Date Format erstellen (js date object). zb. "new Date(2013,10,25,0,0)"

      $jsYear = date('Y', $ts); // 2013
      $jsMonth = date('n',$ts)-1; // 10 (js month start with 0)
      $jsDay = date('j', $ts); // 25 (ohne führende null)
      $jsHour = date('G', $ts); // 0 (ohne führende null)
      $jsMinute = intval(date('i', $ts)); // 0 (ohne führende null)

      $jsDate = "new Date($jsYear,$jsMonth,$jsDay,$jsHour,$jsMinute)";


      //Werte mit komma als Dezimalzeichen sollten auf punkt geändert werden mit
      $data[2] = str_replace(",", ".", "$data[2]");
      $data[3] = str_replace(",", ".", "$data[3]");
      $data[4] = str_replace(",", ".", "$data[4]");

      // Ausgabe Datenzeile für amcharts "new Date(2013,10,25,0,0),t:1.0,etc)
      // Spalten an Werte anpassen z.b Temp in Spalte 3 "$data[2]"

      echo "{date: $jsDate,t:".$data[2].",h:".$data[3].",p:".$data[4]."}";



      }

      }

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

      Ich mach da doch bestimmt noch einen Fehler.

      Gruss
      Hans

      Löschen
    4. Da fehlte was, hier nochmal:

      var chartData = [ = $startzeile OR $data[0] != "")
      {

      //kein komma in Ausgabe Zeile 1
      if ($lcout != 0)
      {
      echo ", \n";
      }
      //komma ab zeile 2
      $lcout = 1;

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

      // Datum und Zeit neuen Variablen zuweisen
      // Variablen zuweisen (Spalten anpassen: "splitDate[0][1][2]")
      $csvYear = $splitDate[2];
      $csvMonth = $splitDate[1];
      $csvDay = $splitDate[0];
      $csvHour = $splitTime[0];
      $csvMinute = $splitTime[1];

      // Timestamp erstellen
      $ts = strtotime("$csvYear-$csvMonth-$csvDay $csvHour:$csvMinute");

      // Ein Timestamp lässt sich einfacher formatieren. zb. "2013-11-25 00:00"
      // $jsDate2 = date('"Y-m-d H:i"', $ts);


      // Date Format erstellen (js date object). zb. "new Date(2013,10,25,0,0)"

      $jsYear = date('Y', $ts); // 2013
      $jsMonth = date('n',$ts)-1; // 10 (js month start with 0)
      $jsDay = date('j', $ts); // 25 (ohne führende null)
      $jsHour = date('G', $ts); // 0 (ohne führende null)
      $jsMinute = intval(date('i', $ts)); // 0 (ohne führende null)

      $jsDate = "new Date($jsYear,$jsMonth,$jsDay,$jsHour,$jsMinute)";


      //Werte mit komma als Dezimalzeichen sollten auf punkt geändert werden mit
      $data[2] = str_replace(",", ".", "$data[2]");
      $data[3] = str_replace(",", ".", "$data[3]");
      $data[4] = str_replace(",", ".", "$data[4]");

      // Ausgabe Datenzeile für amcharts "new Date(2013,10,25,0,0),t:1.0,etc)
      // Spalten an Werte anpassen z.b Temp in Spalte 3 "$data[2]"

      echo "{date: $jsDate,t:".$data[2].",h:".$data[3].",p:".$data[4]."}";



      }

      }

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

      Löschen
  2. Ich habe einen Fehler gemacht und du hast die Falsche Zeile ersetzt;)

    Die erste "if" ändern.
    Es soll nur ausgegeben werden wenn startzeile erreicht UND $data[0] nicht leer ist.

    if($lcin >= $startzeile AND $data[0] != "")

    Ich hatte oder (OR) geschrieben.

    AntwortenLöschen
  3. Hallo Fredy,
    es funktioniert.
    Sollten wir uns mal treffen, dann haste ein oder zwei, ach sagen wir drei 3 gut.
    Vielen, vielen Dank.
    Grüße
    Hans

    http://www.wetter-herbern.de/charts/chart44.php

    AntwortenLöschen