Zeile aus Datei rausschneiden

tekzen

Mitglied
Hallo,

ich möchte aus einer Datei nach Zeile 125 alles entfernen, wie muss es aussehen?

Code:
<?php

<?php

$text = file("datei.txt");  // Textdatei zeilenweise einlesen
unset( $text[1] );  //
unset( $text[2] );  //
unset( $text[125] );  //  hier möchte ich nach Zeile 125 alles löschen wie muss der Befehl aussehen?
$text = implode("\r\n", $text);  // Text wieder zusammenfügen
file_put_contents("datei.txt", $text);  // Text wieder in die Datei schreiben


?>
 
Zuletzt bearbeitet:
Da ziehst Du offenbar das Ganze falsch herum auf. Versuche es so:
Code:
$text = file("datei.txt");  // Textdatei zeilenweise einlesen
// nach Zeile 125 alles löschen
for ($i = 125; $i < count($text), $i++) unset( $text[$i] );
$text = implode(PHP_EOL, $text);  // Text wieder zusammenfügen
file_put_contents("datei.txt", $text);  // Text wieder in die Datei schreiben
 
Wenn ihr eh das ganze Ende abschneidet, würde ich array_slice empfehlen. Ich könnte mir gut vorstellen, dass das um einiges effizienter ist, weil es vielleicht (!) nur eine View auf das originale Array erstellt.
Aber die ganze Datei einzulesen, um dann das Ende abzuschneiden, ist sowieso ineffizient. Was, wenn die Datei mehrere GiBs groß ist?

Eine feste Zeilenendekombination (\r\n oder PHP_EOL) hier zu nutzen, finde ich unschön. Ich arbeite auf Windows präferriert mit Unix Zeilenenden (LF) und ich hasse es fast, wenn mir ein Tool das "aus Versehen" zu CR LF konvertiert.

Beim Stöbern auf StackOverflow bin ich zufällig auf die SplFileObject-Klasse gestoßen, die genau die benötigte Funktionalität anbietet - und das wahrscheinlich auch sehr effizient:

PHP:
function cutFileAfterLine($filename, $line) {
  $file = new SplFileObject($filename, 'r+');
  $file->flock(LOCK_EX); // prevent race conditions
  $file->seek($line); // seek to line position, not fseek!
  $file->ftruncate($file->ftell());

  // first flush, then unlock, and close
  $file->fflush();
  $file->flock(LOCK_UN);
  $file = null; // "close" the file (this is the SPL way of closing)
}

cutFileAfterLine('datei.txt', 125);

Möglicherweise bin ich bei $file->seek($line) off-by-one und tatsächlich müsste man $file->seek($line + 1) tun. Das könnt ihr ja mal ausprobieren :)
 
Zuletzt bearbeitet:
Zurück