Bestimmte Zeile aus einer Textdatei löschen

Eagle-PsyX-

Erfahrenes Mitglied
Hi,
ich hab ein kleines Problem mit meinem Log. Und zwar sollen alle Einträge die älter sind als z.B. 3600 Sekunden. Zum Beispiel (stark vereinfacht):
Log.log hat gesagt.:
1-1222707006
4-1222707045
8-1222709874
1-1222710214
1-1222711012
Der String
PHP:
"$UserID-".time()."\n"

Nun sollen eben alle Einträge (Zeilen) die älter sind als $X (3600) gelöscht werden. Aber wie?
 
Due liest die Datei einfach Zeile für Zeile aus und suchst nach dem "-" Zeichen in diesem Fall, das dahinter prüfst du darauf, ob es älter als 3600 sek ist, wenn ja dann löscht du es.
 
Ja das ist mir schon klar. Die Frage ist nur wie. Ich komm da net wirklich vorran mit den "löschen" an sich und den 'wechseln' zwischen den Zeilen.
 
Kurz überlegt, würde ich die Zeilen in einem Array speichern, dann kannst du ja einfach die Spalten im Array löschen und nacher wieder eintragen
 
Mein Problem besteht aber immernoch darin, das ich nicht weiß wie ich zwischen den Zeilen wechseln soll/kann. Geschweige denn dann diese in Arrays bunkern.

Aber vom Ansatz gut, danke.

Eine primitve Methode (meine Idee^^) wäre jetzt einfach immer jeweils die erste Zeile öffnen und überprüfen ob diese stimmt, wenn nicht wird diese "gelöscht"(wie?) und danach geht es mit der nächsten erste Zeile so los (for schleife), bis er alle durch hat oder einfach die erste nicht mehr übereinstimmt (die sind ja chronologisch sortiert).
Aber dafür müsst ich wissen wie ich die Zeilenanzahl 'lese' (kann ich nach "\n" suchen?), und dannach halt noch "lösche".
 
Zuletzt bearbeitet:
So danke. Habs fertig geschaft. Wenn jemand interesse hat. Dann schaut euch das mal an:

So, wenn der Server über einen FTP Zugang für "Daten-Archivierung" hat, werden alle älteren Logs nach $TimeFTP (6 Monaten) als ZIP Archiv komprimiert und verschoben. Ansonsten werden alle Einträge die älter sind als $Time (2 Monate) gelöscht.

Aufgerufen bloß durch:
PHP:
CheckLogFile("Logs/Login.log","-",$Config["LogLogin"],$Config["LogFTP"],2);

Wobei die 2 für die 3.Stelle am Explode steht, worin die TimeStamp verborgen ist.


PHP:
function CheckLogFile ($Filename,$Delimiter,$Time,$TimeFTP,$Servo)
{
if(file_exists($Filename) AND file_exists(substr($Filename,0,-4)."Date".substr($Filename,-4)))
	{
	$Inc = include("Config/config.php");
	$DateFilename = substr($Filename,0,-4)."Date".substr($Filename,-4);
	$LogDate = fopen($DateFilename,"r"); 
	$CreatedTime = fgets($LogDate);
	fclose($LogDate);
	if($Inc AND $Config["FTP"] AND $Config["TimeStamp"] - $CreatedTime >= $TimeFTP)
		{
			$Name = substr(substr($Filename,strrpos($Filename,"/")+1),0,-4);
			File_ZIP (substr($Filename,0,-4),$Filename);
			$FileZIP = substr($Filename,0,-4).".zip";
			$FTPcon	=	ftp_connect($Config["FTPHost"],$Config["FTPPort"]) or die(Alert(4));
			ftp_login($FTPcon,$Config["FTPUser"],$Config["FTPPassword"]) or die(Alert(5));
			ftp_chdir($FTPcon,$Config["FTPFolder"]);
			$NewFile = "$Config[Nameabbr]-$Name-".date("m.Y",$Config["TimeStamp"]).".zip";
			$Upload = ftp_put($FTPcon,$NewFile,$FileZIP,FTP_BINARY);
			ftp_chmod($FTPcon,0400,$NewFile);
			ftp_quit($FTPcon) or die(Alert(6));
			if($Upload)
				{	
					unlink($FileZIP);
					unlink($Filename);
					unlink($DateFilename);
				}
			unset ($FileZIP); unset ($FTPcon); unset ($NewFile); unset ($Upload);
			return true;
		}	elseif ($Inc AND !$Config["FTP"] AND $Config["TimeStamp"] - $CreatedTime >= $Time) {
		$Finish = "";
		$Stop = 0;
		$Content = file_get_contents($Filename);
		$FilePart = explode("\n",$Content);
		$CountParts = count($FilePart);
		for($i=0; $i < $CountParts; $i++)
			{
			$Part = explode("-",$FilePart[$i]);
			if(false)
				{
					$FilePart[$i] = 0;
				}
				
			if($Config["TimeStamp"] - $Part[$Servo] > $Time AND $Stop == 0)
				{
				if($i < $CountParts-2)
					{    $FilePart[$i] .= "\n";    }
					$Finish .= $FilePart[$i];
				}	else	{	$Stop = 1;	$i = $CountParts+1;	}
		}
		file_put_contents($Filename,$Finish);
		chmod($Filename, 0600);
		unset($Stop);
		unset($Content);
		unset($FilePart);
		unset($CountParts);
		return true;
		}
unset($CreatedTime);
	}	else {	return false;	}
}

Sollte man das vielleicht als Tutorial schreiben?^^

EDIT: Man könnt es noch etwas verbesser, dass keine Daten verglichen werden um Einträge zu löschen, wenn der erste Fehlgeschlagene Eintrag gefunden wurde. Es ist chronologisch aufgebaut, also werden die Daten danach auch alle fehlschlagen. Das müsste eigentlich schnell gemacht werden, doch .. ich bin zu müde- morgen^^.
 
Zuletzt bearbeitet:
Zurück