cliodriver
Mitglied
eventuell kann ein Mod das abzwacken und in die Kategorie PHP schieben
Folge dem Video um zu sehen, wie unsere Website als Web-App auf dem Startbildschirm installiert werden kann.
Anmerkung: Diese Funktion ist in einigen Browsern möglicherweise nicht verfügbar.
$monat = date("d.m.Y", strtotime("-3 month"));
DateTime
und die Funktion diff
verwenden.das Datum ist eigentlich nicht das ProblemIch habe deinen Code nicht von Anfang bis Ende analysiert aber hier:
sehe ich, dass Du Tag.Monat.Jahr für das Format des Datums verwendest, ebenso in der CSV-Datei, die Du angehängt hast. Damit funktioniert ein Vergleich nicht, Du musst das umgekehrte Format Jahr.Monat.Tag verwenden.Code:$monat = date("d.m.Y", strtotime("-3 month"));
Oder alternativ kannst Du das Ganze objektorientiert aufziehen undDateTime
und die Funktiondiff
verwenden.
<?php
error_reporting(0);
ini_set('memory_limit', '1024M'); // or you could use 1G
// CSV auslesen---------------------------------------------------------------------------------------------------------------------
function csvToArray($csvFile){
$file_to_read = fopen($csvFile, 'r');
while (!feof($file_to_read) ) {
$lines[] = fgetcsv($file_to_read, 1000, ';');
}
fclose($file_to_read);
return $lines;
}
//read the csv file into an array
$csvFile = 'HK40Log - Kopie.csv';
$csv = csvToArray($csvFile);
//render the array with print_r
//echo '<pre>';
//print_r($csv[0]);
//echo '</pre>';
$tempfile = 'temptest.csv';
$monat = date("d.m.Y", strtotime("-3 month"));
echo "Datum ab dem zurück gesucht wird: " . $monat;
$suchstring = strtotime($monat);
$aarray=array('0', '3'); //Werte die bleiben, 0 = volle Stunde, 3 = halbe Stunde
$il = 0;
foreach($csv as $subArray){
$lines = $subArray[0] . ' Line ' . $il . ' bleibt<br>';
$subArray[0] = utf8_decode($subArray[0]);
$subArray[0] = str_replace('?', '', $subArray[0]);
$substring = substr($subArray[0], 0, 10);
$substring = strtotime($substring);
if($substring < $suchstring){
//echo '<p>' . $subArray[0] . '</p>';
//echo '<p>' . substr($subArray[0], 14, 2) . '</p>';
$a = substr($subArray[0], 14, 1);
if (!in_array($a,$aarray)){
//echo '<p>' . $subArray[0] . '</p>';
}else {
$i = 0;
while ($i < 169) {
$line = $line . $csv[$il][$i] . ";";
$i = $i + 1;
}
echo '<p>' . $lines . '</p>';
}
}
if($substring > $suchstring){
$i = 0;
while ($i < 169) {
$line = $line . $csv[$il][$i] . ";";
$i = $i + 1;
}
echo '<p>' . $lines . '</p>';
}
$temp = file_get_contents($tempfile,"r");
$file = fopen($tempfile, 'w+');
fwrite($file, chr(239) . chr(187) . chr(191) . $line . "\n" . $temp);
$il = $il + 1;
}
fclose ($file);
?>
var_dump($lines);
if ($substring < $suchstring)
Hast Du das wirklich über einen Zeitraum von mehr als 3 Monaten getestet? Ich bin immer noch der Meinung, dass ein String-Vergleich bei einem Format Tag.Monat.Jahr nicht funktionieren kann.Aktuell werden zwar die gewünschten Zeilen in eine csv geschrieben, doch leider ohne Zeilenumbruch
DateTime
mal durchgezogen:<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
ini_set('memory_limit', '1024M'); // or you could use 1G
// CSV auslesen---------------------------------------------------------------------------------------------------------------------
// Intervall zwischen den Zeiten wenn ausgedünnt wird in Minuten:
$intvBetween = 30;
// Intervall in die Vergangenheit wo ausgedünnt werden soll
// in Tagen:
$intvBefore = 90;
$csvFile = 'HK40Log.csv';
$destFile = 'HK40Log-filtered.csv';
$now = new DateTime();
var_dump($now);
$lastWritten = new DateTime();
$file_to_read = fopen($csvFile, 'r');
$file_to_write = fopen($destFile, 'w+');
while (!feof($file_to_read)) {
$line = fgetcsv($file_to_read, 1000, ';');
// Damit der folgende Code fehlerfrei funktioniert
// muss die Zeile erfolgreich geparst sein:
if ($line !== false) {
// Um von der genauen Position von Datum und Zeit unabhängig zu sein,
// benutzen wir eine Regex:
preg_match('/\d\d\.\d\d\.\d{4} \d\d:\d\d:\d\d/', $line[0], $matches);
var_dump($matches);
$currentTime = DateTime::createFromFormat('d.m.Y G:i:s', $matches[0]);
$diffBefore = $currentTime->diff($now);
var_dump($diffBefore->days);
if ($diffBefore->days > $intvBefore) {
var_dump('line is older than $intvBefore days');
// Die Zeile ist älter als $intvBefore,
// prüfen ob das Intervall zwischen zwei Ausgaben
// schon abgelaufen ist:
$diffBetween = $currentTime->diff($lastWritten);
var_dump($diffBetween->days);
if ($diffBetween->i + $diffBetween->h * 60 > $intvBetween) {
var_dump('$intvBetween exeeded, write it');
$lastWritten = DateTime::createFromFormat('d.m.Y G:i:s', $matches[0]);
fputcsv($file_to_write, $line, ';');
}
} else {
var_dump('line is younger than $intvBefore days, write uncond.');
// Die Zeile ist jünger als $intvBefore,
// wir schreiben sie direkt in die Zieldatei:
fputcsv($file_to_write, $line, ';');
}
}
}
fclose($file_to_read);
fclose($file_to_write);
<?php
ini_set('display_errors', '1');
error_reporting(E_ALL);
ini_set('memory_limit', '1024M'); // or you could use 1G
// CSV auslesen---------------------------------------------------------------------------------------------------------------------
// Intervall zwischen den Zeiten wenn ausgedünnt wird in Minuten:
$intvBetween = 30;
// Intervall in die Vergangenheit wo ausgedünnt werden soll
// in Tagen:
$intvBefore = 90;
$csvFile = 'HK40Log.csv';
$destFile = 'HK40Log-filtered.csv';
$now = new DateTime();
var_dump($now);
$lastWritten = new DateTime();
$file_to_read = fopen($csvFile, 'r');
$file_to_write = fopen($destFile, 'w+');
$lineNr = 1;
while (!feof($file_to_read)) {
echo "Zeile $lineNr<br>";
$line = fgetcsv($file_to_read, 1000, ';');
// Damit der folgende Code fehlerfrei funktioniert
// muss die Zeile erfolgreich geparst sein:
if ($line !== false) {
// Um von der genauen Position von Datum und Zeit unabhängig zu sein,
// benutzen wir eine Regex:
preg_match('/\d\d\.\d\d\.\d{4} \d\d:\d\d:\d\d/', $line[0], $matches);
// Den Fall abfangen, dass dieses Format nicht gefunden wurde:
if (isset($matches[0])) {
var_dump($matches);
$currentTime = DateTime::createFromFormat('d.m.Y G:i:s', $matches[0]);
$diffBefore = $currentTime->diff($now);
var_dump($diffBefore->days);
if ($diffBefore->days > $intvBefore) {
var_dump('line is older than $intvBefore days');
// Die Zeile ist älter als $intvBefore,
// prüfen ob das Intervall zwischen zwei Ausgaben
// schon abgelaufen ist:
$diffBetween = $currentTime->diff($lastWritten);
var_dump($diffBetween->days);
if ($diffBetween->i + $diffBetween->h * 60 > $intvBetween) {
var_dump('$intvBetween exeeded, write it');
$lastWritten = DateTime::createFromFormat('d.m.Y G:i:s', $matches[0]);
fputcsv($file_to_write, $line, ';');
}
} else {
var_dump('line is younger than $intvBefore days, write uncond.');
// Die Zeile ist jünger als $intvBefore,
// wir schreiben sie direkt in die Zieldatei:
fputcsv($file_to_write, $line, ';');
}
} else {
echo 'Fehler beim Parsen von "' . $line[0] . '"<br>';
}
}
$lineNr++;
}
fclose($file_to_read);
fclose($file_to_write);