nach zeilen löschung in TXT DB leerer zeilenumbruch

than

Mitglied
guten abend

ich habe 144 treffer mit der suche erreicht und nach den ersten 50 habe ich es aufgegeben.

ich möchte bestimmte zeilen aus einer text DB löschen.
dies klappt auch - nur wenn die letzte zeile gelöscht werden soll, so geht es entweder garnicht oder sie wird gelöscht und ein (leerer) zeilenumbruch (\n) wird gesetzt.
wie bekomme ich den zeilenumbruch weg?
wie gesagt NUR wenn ich die letzte zeile lösche kommt der umbruch, wenn einer in der mitte gelöscht wird, erscheint er nicht.

ich habe es mit 2 lösungen versucht. bei beiden werden die daten mit file() in ein array gelesen.
einmal wird die zu löschende zeile mit einer id (mit get übergeben) identifieziert und mit unset() gelöscht, doch wenn es die letzte zeile ist so wird sie garnicht gelöscht, statt dessen wird die letzte zeile nochmal zerhackt ans ende dran gesetzt.

die bessere lösung (wie ich finde) ist, mit einer for schleife die einträge alle neu in die txt datei schreiben zu lassen. wenn mit get übergebene ID "dran" ist, wird sie nicht mit geschrieben.
ist sie an der letzten zeile, so wird diese gelöscht aber dafür eine leer zeile gespeichert.


diese leere zeile darf nicht sein da sonst mein ganzes restliches script durcheinander kommt.

alle scripte wo ich hier gefunden hatte - da war das wohl nicht so wichtig ob ne leere zeile am ende kommt - oder die user haben das nicht festgestellt beim testen.

wer kann mir helfen?
 
Ein bisschen Code könnte nicht schaden.

Ganz blöde Frage: Du fängst beim array mit 0 an zu zählen und nicht mit 1?

Du könntest Dir nach dem Löschen den letzten Wert des array anschauen und von hinten an dem String alle \n und \r löschen.
Wenn Leerzeichen und so am Ende un Anfang eine Zeile nicht weiter wichtig sind, kannst Du auch mit trim() jedes array-Element bearbeiten und mit implode wieder \n dazwichen setzen.
 
hi

ja ich fange im array bei 0 an (würde aber lieber mit 1 anfangen :/ )

hier ist der code wo die letzte zeile nicht gelöscht wird (und zerhackt nochmal dran gehängt wird)
PHP:
$id = 18; // $id wird mit dem link mit GET übergeben
 
$file_array = @file("text.txt"); 
$nr = $id - 1; 
unset ($file_array[$nr]); 
$file_open = @fopen("text.txt", "r+");
fwrite($file_open, implode("", $file_array)); 
fclose($file_open);

--------------------------------------------------------------------------



hier ist der code der mir besser gefällt, wo auch als letzten eintrag die zeile löscht aber eine leerzeile schreibt.
PHP:
$id = 18; // $id wird mit dem link mit GET übergeben
 
$file_array = @file("text.txt");
$file_count = count($file_array);
$file_open = @fopen("text.txt", "r+");
$nr = $id - 1;
for ($row = 0; $row < $file_count; $row++)
{
if ($row != $nr)
{
fwrite($file_open, $file_array[$row]);
}
}
fclose($file_open);
 
Versuch mal so:
PHP:
 $id = 18; // $id wird mit dem link mit GET übergeben

$file_array = @file("text.txt");
$file_count = count($file_array);
$file_open = @fopen("text.txt", "r+");
$nr = $id - 1;
$neuesarray=array();
for ($row = 0; $row < $file_count; $row++) {
    if ($row != $nr) {
        $neuesarray[]=$file_array[$row];
    }
}
while ($neuesarray[sizeof[$neuesarray]-1]][strlen($neuesarray[sizeof[$neuesarray]-1])]=="\n" || $neuesarray[sizeof[$neuesarray]-1]][strlen($neuesarray[sizeof[$neuesarray]-1])]=="\r" ) {
    $neuesarray[sizeof[$neuesarray]-1]]=substr($neuesarray[sizeof[$neuesarray]-1]],0,strlen($neuesarray[sizeof[$neuesarray]-1])-1);
}
forech ($neuesarray as $row) {
    fwrite($file_open, $row);
}
fclose($file_open);

Sieht ein bisschen umständlich aus und geht bestimmt auch einfacher, aber das sollte es tun.
 
Sorry, ich hab das hier im Editor geschrieben, dafür ist es wohl etwas umständlich.
Hier also noch mal die while-Schleife:
PHP:
while (
    sizeof($neuesarray)>0
    &&
    strlen($neuesarray[sizeof($neuesarray) - 1]) > 0
    && (
        $neuesarray[sizeof($neuesarray) - 1]
            [strlen($neuesarray[sizeof($neuesarray) - 1]) - 1]
                == "\n"
        ||

        $neuesarray[sizeof($neuesarray) - 1]
            [strlen($neuesarray[sizeof($neuesarray) - 1]) - 1]
                == "\r"
        )
    ) {
    $neuesarray[sizeof($neuesarray) - 1] =
        substr($neuesarray[sizeof($neuesarray) - 1],
        0,
        strlen($neuesarray[sizeof($neuesarray) - 1]) - 1);
}
Die hat bei mir in dem letzen Array-Element die am Ende stehenden Zeilenumbrüche entfernt.
 
hast noch das foreach() vergessen ;)
jetzt gibt es keine fehler, aber die letzte zeile wird nicht gelöscht, alle anderen kann ich löschen.

sieht kompliziert aus was du gebaut hast. muss mich da mal ausseinander mit setzen.
 
Der letzte Code, den ich gepostet habe ersetzt NUR die while-Schleife von dem Code, den ich vorher gepostet habe.
Die for-Schleife, die ich davor zum löschen benutzt habe, war im Prinzip nur cut'n'paste von Dir. Ich habe nur statt dem Schreiben in die Datei an das array angehängt. Du sagtest doch, in dem Code löscht er die letzte Zeile, lässt nur eine Leerzeile?

Das ganze ist eigentlich nur recht umständliches zugreifen auf jeweils das letzte Element in einem verschachtelten array, wobei hier der String auch ein array von chars ist. Auf die Zeichen greife ich über den Index zu.
 
hpvw hat gesagt.:
Der letzte Code, den ich gepostet habe ersetzt NUR die while-Schleife von dem Code, den ich vorher gepostet habe.
jap das ist mir schon klar.

ich werde das ganze mir morgen nochmal genau anschauen und den fehler suchen warum es jetzt (mit while schleife) den letzten eintrag nicht mehr löschen tut.
ich melde mich hier also nochmal :)

auf jeden fall hab dank für deine gute hilfe.

gute N8
 
Zurück