Löschen von Daten aus textbasiertet Datenbank?


R

ratelco

Hallo,
ich habe folgendes Problem. Ich will in einer textbasierten Datenbank (*.dat Datei) Daten löschen können, indem in einem Formular eine eindeutige Identifikationsnummer eingetragen wird, und dann in der Datenbank die Zeile, in der die Nummer vorkommt gelöscht wird. Nun hatte ich schon mal folgenden Vorschlag bekommen:

open(DATA,"file.dat");
my $file = <DATA>;
close(DATA);

my @file = split(/\#/,$file);

my $i;
while($i<=$#file){
# Anhand der Nr.löschen
if($file[$i] eq $nr){
splice(@file,$i,6);

last;
}
$i = $i + 6;
}

open(DATA,">file.dat");
print DATA join


Wobei die Textdatei folgendermaßen aufgebaut ist:

Nr.#Nachname#Email#Datum#Zeit#Code
145487#Max#ma.must@a.de#25.06.2007#12:53:16#RRyuQsyQ5s
168485#Tim#tim.mus@a.de#25.06.2007#12:58:06#RRyuQs5fys


Soweit ich das verstanden habe, wird die gesamte Textdatei nun durchgegangen, wobei das $i jeweils eine Eingabe zählt, sprich mit ($i eq $nr) wird geprüft, ob eine eingegebene Nummer der Nr. in der Datei entspricht. wenn das der Fall ist, wird dann mit splice(@file,$i,6); die 6 Eingabefelder von Nr. bis Code (also eine Zeile) gelöscht und mit last zum Ende gesprungen oder ansonsten wird mit $i= $i+6 in die nächste Zeile gesprungen.

Leider funktioniert das ganze so noch nicht, außerdem verstehe ich nicht, was my @file = split(/\#/,$file); genau bewirken soll. Bin für jede Hilfe und Idee dankbar.
 

renee

Erfahrenes Mitglied
So wie der Code da steht, fehlen Fehlerbehandlung, es wird nur die erste Zeile eingelesen, wird viel unnötiges getan, ist speicherfressend...

So etwas kann man gut mit Tie::File machen:

Code:
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $file = '/path/to/text.dat';
my $search = 145487;

# zeilen werden automatisch in das Array @lines geladen
# or die $! gibt eine Fehlermeldung aus wenn das Oeffnen nicht klappt
tie my @lines, 'Tie::File', $file or die $!;

# von hinten nach vorne gehen um Seiteneffekte zu vermeiden
for my $i( reverse 0.. $#lines ){
    if( $lines[$i] =~ /^$search#/ ){
        splice @lines, $i, 1;
        last;
    }
}

# schreibe Zeilen wieder in die Datei
untie @lines;
(ungetestet)