Migration einer CSV-Datei in die IPS-Datenbank

Mir steht eine CSV-Datei in folgender Form zur Verfügung:

900540450,2
900626850,6
900713250,6
901145250,3
901490850,2
901577250,5
901663650,6
901750050,2
902009250,2
...
1449875250,0
1449961650,2
1450220850,7
1450652850,3
1450912050,4
1451516850,4

über 1600 Einträge(Zeitstempel, Wert).
Ich würde sie gerne in eine Variable importieren, um sie künftig in IPS zu verwalten.
Diese Frage

wurde von paresy so beantwortet:

Es ist zwingend erforderlich, dass für jeden Monat eine Datei erstellt wird.
Ich könnte mir vorstellen, dass du evtl. ein kleines Skript erstellst, welches diese Aufgabe für dich erledigt?

Meine Frage deshalb, wie kann ich dies umsetzen?
Meine Hoffnung, es gibt schon Ansätze.
Gefunden habe ich bisher nichts, was mir weiterhilft.

Es wäre also notwendig, aus dieser Datei die Datensätze monatlich zu separieren und jeweils eine Datei mit der Variablen-Id (12345.csv) in einem entsprechenden Monats- im entsprechenden Jahresverzeichnis zu erstellen und dann die Variable zu aktivieren.
Manuell ist dies nur schwer möglich, die Daten sind z.Zt. von 1998 bis Dez. 2015.

Ich glaube am einfachsten ist, wenn du dir dafür ein Skript baust, welches deine Datei lädt und genau dies tut.

paresy

Genau dies hatte ich befürchtet. Da war halt die Hoffnung, dass schon was da ist.

Dann werde ich mich mal dran machen. Obs klappt? Ich werd es zwar versuchen, habe aber Bedenken, dass ich das schaffe.

Und bei Gelegenheit werde ich dann mal ein „Ergebnis“ hier posten.

So, hier ist mein Ergebnis:
Voraussetzung CSV-Datei, siehe Post 1

Vorgehensweise:
Integer-Variable anlegen, Loggen einschalten.
ID der Variable in dem Script eintragen
Script starten
Reaggregieren

Das Script legt alle Unterverzeichnisse Jahr und Monat an und speichert die Werte am entsprechenden Platz.
Ich habe dies zunächst bei einem kleinen Testsystem auf einem Raspberry versucht, um meine grosse Datenbank wegen möglicher Fehler zu schonen.
Das läuft z.Zt. nur auf dem RasPi wegen der system()-Befehle zum Anlegen der Unterverzeichnisse.
Bitte bei Windows oder Mac-Anwendung daran denken.

<?
// CSV-Datei in die IPS-Datenbank einfügen
// von audi2010 26.10.2016
//
$id = 50285 /*[CSV-Import\Zeitumwandlung\Tageswerte]*/ ;  //ID der Variablen, die gefüllt werden soll
$filein = '/home/pi/Downloads/RegenTab.csv';
$jahr  = '1998' ;
$monat = '01' ;
$fileout = '/var/lib/symcon/db/' . $jahr . "/" . $monat;
echo $fileout;

$handle = fopen($filein, 'r');
$data = fread($handle, filesize($filein));
fclose($handle);

$arr = explode("
", $data);


foreach ($arr as $tag) {
    $pos = strpos($tag, ',');
    $zeit = intval(substr($tag,0,$pos));
    $jahr  = date('Y', $zeit);
    $monat = date('m', $zeit);
    $wert = intval(substr($tag, $pos+1));
    $fileout = '/var/lib/symcon/db/' . $jahr . "/" . $monat . "/" . $id . ".csv";
    // Prüfen, ob Unterverzeichnis existiert
    if (file_exists('/var/lib/symcon/db/' . $jahr))  {
        //    echo $jahr . " existiert" . "
" ;
    }
    else  {
        //Jahr anlegen
        system('mkdir /var/lib/symcon/db/' . $jahr);
        //    echo $jahr . " wurde angelegt" . "
" ;
    }

    //Prüfen und Anlegen der Monatsverzeichnisse
    if (file_exists('/var/lib/symcon/db/' . $jahr . "/" . $monat))  {
        //echo $monat . "/" . $jahr . " existiert" . "
" ;
    }
    else  {

        //Monat anlegen
        system('mkdir /var/lib/symcon/db/' . $jahr . "/" . $monat);
        echo $monat . "/" . $jahr . " wurde angelegt" . "
" ;
    }
    // Prüfen, ob Datei im UV existiert

    $hout = fopen($fileout, 'a');

    fwrite($hout, ($zeit . "," . $wert . "
"));
    unset($tag);
    fclose($hout);
}
?>

Was mir auffällt. er reaggregiert nur ab 10.09.2001. Das ist der Moment, indem der Unix-Timestamp von 9 auf 10 Stellen springt.
Die Werte 1998 bis 2000 sind zwar gespeichert, erscheinen aber nicht im Archiv.
Mir ist durchaus bewusst, dass die fehlenden Werte wohl bei niemand, ausser mir gebraucht werden, aber vielleicht gibt es hier ein einfache Lösung.

Bisher leider nicht. Wir fangen tatsächlich erst an ab dem Jahre 2000 zu suchen.

paresy

Hallo - ich verwende das Script mit einer CSV Datei in der ich die Unix Timestamps berechnet habe. Leider passiert nichts ausser der Meldung: /var/lib/symcon/db/20/01

Die Werte in der CSV sind z.B.

1504183091;30622
1501504691;30563
1498826291;30507
1496234291;30450
1493555891;30302
1490963891;30057
1488285491;29733
1485866291;29205

ok - habe es gefunden :banghead: … man muss das mit dem COMMA seperated file wörtlich nehmen. Also kein ; sondern ein , zwischen den Werten - dann geht es :o

Cooles Script! Schade das es keinen direkten Import von IPS gibt.

Danke fürs Lob. Freut mich immer, wenn ich was für die Community tun kann.