PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ersetzen einzelner Zeilen einer Textdatenbank mit Perl?



antimon
20-02-2000, 18:53
Hi,

sagt mal, wie funzt das Ersetzen einzelner Zeilen einer Textdatenbank mit Perl??
Ich habe eine Textdatei, in der in jeder Zeile eine Nummer von 11-100 steht, danach folgt ein Doppelpunkt und danach steht ein Name, also z.B. so:

11:Martin
12:Matthias
...

Ich möchte damit einen Sitplan realisieren, bei dem sich jeder online eintragen kann.
Wenn noch niemand auf einem Platz sitzt, ist der Eintrag rechts neben dem Doppelpunkt leer. Die Zahlen links sind die Platznummern.

Wenn sich jemand z.B. den Platz 51 reservieren will, soll die Zeile, die mit "51" beginnt, gesucht werden und durch "51:Username" ersetzt werden. Will jemand den Platz doch nicht mehr haben, soll wiederum die Zeile mit "Platznummer:Username" gesucht und durch "Platznummer:" ersetzt werden.

Ich habe schon vergeblich nach Hilfe in meinem Perl-Buch gesucht, aber nix gefunden.

Könnte mir jemand von Euch helfen???

Thx,
Antimon

robert
22-02-2000, 03:27
Hallo!

Es gibt im Prinzip zwei Möglichkeiten, die zwar gundsätzlich gleich sind, aber sich darin unterscheiden, ob die Text-Datenbank sehr groß ist/wird.

a) Du lädst die komplette Datei ein und bearbeitest das ganze im Speicher um dann die Daten wieder geändert in die Datei zu speichern.

b) Du bearbeitest die Datei zeilenweise (jede Zeile einzeln einlesen und ebarbeiten) und speicherst die bearbeiteten Daten erst in eine temp. Datei und kopierst diese dann um.

Wenn möglich, empfehle ich a) !

Hier die eigentliche Bearbeitung mit Möglichkeit a). Bei b) mußt du das ganze entsprechend anpassen und ändern.



my $DBName = "file.tdb";
my @DBData = ();

# MAIN
######

# erst mal Datanbank einlesen...
&LoadDB;

# Hier jetzt User add oder delete...
&AddUser(12, "Dieter Müller");
&DeleteUser(53);

&SaveDB;

exit 0;

# Funktionen
############

sub LoadDB()
{
if (open(TDBFILE,"<$DBName")
{
my @TextDB = ();
my $DBEntry;

@TextDB = &lt;TDBFILE&gt;;
close(TDBFILE);

foreach $DBEntry (@TextDB)
{
my ($PEntry,$UserName) = split(/:/, $DBEntry);

# Ich gehe davon aus, das die Einträge durchgehend sind...
push(@DBData, $UserName);
}
}
else
{
# Hier Fehlerbehandlung...
}
}

sub SaveDB()
{
if (open(TDBFILE,"<$DBName")
{
my $i;

for(i = 0; $i < $#DBData; $i++)
{
print TDBFILE "$i:$DBData[$i]\n";
}
close(TDBFILE);
}
else
{
# Fehlerbehandlung...
}
}

# Hier kommen jetzt Funktionen zum hinzufügen oder entfernen eines Users
sub AddUser($Entry, $User)
{
my ($Entry, $User) = @_;

$DBData[$Entry] = $User;
}

sub DelUser($Entry)
{
my ($Entry) = @_;

$DBData[$Entry] = "";
}


Falls die Einträge in der Text-Datenbank nicht durchgehend ihrer Nummer sind, solltest du für @DBData eine Hash-Table (%DBData) benutzen.

Gruß

Robert


[Diese Nachricht wurde von robert am 22. Februar 2000 editiert.]

robert
22-02-2000, 17:05
Sorry, kleine Korrektur...

Bei SaveDB statt $#DBData lieber (scalar @DBData) schreiben, oder du mußt statt kleiner ein kleiner-gleich davor einsetzen!

Gruß

Robert

antimon
22-02-2000, 19:57
Danke für die Antwort, Robert.

Wenn das Skript läuft, kann ich dir ja die Adresse sagen.

Ich arbeite nämlich gerade an einem Sitzplan für unsere nächste LAN-Party, wozu ich dich recht herzlich einlade ;-)))
Auf diesem soll es möglich sein, einen bereits reservierten Platz wieder freizumachen.

Danke schön für den Hinweis!

Hagen von Tronje
22-02-2000, 23:24
Hi,

Roberts a) b) Antwort erweckt den Eindruck,
der Compi wuerde tatsaechlich die Datei
zeilenweise einlesen, was nicht stimmt
-> Cache, Read-Ahead.

Hagen

robert
23-02-2000, 01:04
Antimon...

Du warst nicht zufällig letztes WE auf einer LAN-Party in Paderborn, oder? http://www.linuxforen.de/ubb/smile.gif

Robert

robert
23-02-2000, 01:10
Hagen,

es gint nicht darum wie und ob er es so einliest, sondern um die Art der Verarbeitung.
Man kann das ganze auch so umbauen, das die Daten Zeilen-Weise verarbeitet werden und direkt geändert werden.

input to output

Robert

antimon
23-02-2000, 09:39
Nee, aber wir veranstalten hier in Bayern, südlich von München Netzwerkparties. Wenn du kommen möchtest, kannst du das gerne tun (www.langame.de).

Wäre mal toll, jemand von Euch kennenzulernnen...

reno
23-02-2000, 11:58
Da hab' ich's ja nicht weit von Hohenpeißenberg. http://www.linuxforen.de/ubb/smile.gif

Hack on


------------------
Gruss Reno

Christoph
24-02-2000, 09:40
Warum machst du sowas mit Perl??????
(von hinten durch die Brust ins Auge?)

Mit sed geht das viel einfacher:

sed "s/\(^51:\).*/\1username/"