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}
Hallo Fredy,
AntwortenLöschenich 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
Hallo Hans
LöschenSind da evtl. leerzeilen in der datei ?
Versuche mal leere zeilen auszuschliessen.
LöschenFolgende Zeile ändern:
f($lcin >= $startzeile)
auf
if($lcin >= $startzeile OR $data[0] != "")
Hallo Fredy,
Löschenleider 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
Da fehlte was, hier nochmal:
Löschenvar 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 habe einen Fehler gemacht und du hast die Falsche Zeile ersetzt;)
AntwortenLöschenDie 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.
Hallo Fredy,
AntwortenLöschenes 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