Zeile in Textdate in Mitte einfügen - wie?
Steve
- perl
0 lois0 Steve0 lois0 Steve
0 Peter Kaufmann0 Steve
0 Andres Freund
Hallo zusammen,
habe folgende Frage:
Ich habe eine reine Textdatei die z.B. so aussieht:
1|pc-d|23:20:53|1|1|1|1|1@1.de|1|1|1|1|no|1
2|pc-d|23:21:06|1|1|1|1|1@1.de|2|2|2|2|no|1
3|pc-d|23:21:20|1|1|1|1|1@1.de|3|3|3|3|no|1
4|pc-d|23:21:20|1|1|1|1|1@1.de|3|3|3|3|no|1
: : : : : :
555|pc-d|21:21:20|1|1|1|1|1@1.de|3|3|3|3|no|1
Jede Zeile entspricht einem Datensatz. Die Felder sind durch das PIPE-Symbol getrennt. Die Grösse der Datei kann auf mehrere hundert Sätze anwachsen.
Nun möchte ich z.B. zwischen Zeile 3 und 4 einen neuen Satz hinzufügen. Wie kann man denn das am besten machen?
Vielleicht so? Textfile in ein Array laden. Kann man dann den PUSH Befehl anwenden, um gezielt in eine Zeile des Arrays zu schreiben?
Oder brauche ich ein zweites Hilfsarray / Datei in das ich bis Zeile 3 schreibe, dann den neuen Satz einfügen und dann den Rest ab Zeile 4 bis Ende. Zum Schluss das Array in das Textfile zurückschreiben.
Aber was ist, wenn das Textfile einige hundert Zeilen hat. Kann es dann zu Problemen kommen, wenn das gesamte Textfile in ein Array geladen wird? Zur Info das Skript läuft auf einem grossem Server mit einigen GByte Speicher.
THX
Steve
Vielen Dank schon mal!
Steve
hi,
Nun möchte ich z.B. zwischen Zeile 3 und 4 einen neuen Satz hinzufügen. Wie kann man denn das am besten machen?
splice @list, 3, 0, 'dass will ich einfügen'
lg, lois.
splice @list, 3, 0, 'dass will ich einfügen'
Hi Lois,
was so einfach ist das! Danke für die Info.
Was meinst du, ab wann es denn zu Speicherproblemen kommen kann, wenn die gesamte Textdatei auf einmal geladen wird. Ich glaube, dazu mache ich wohl einen neuen Thread auf.
Bye,
Steve
Was meinst du, ab wann es denn zu Speicherproblemen kommen kann, wenn die gesamte Textdatei auf einmal geladen wird. Ich glaube, dazu mache ich wohl einen neuen Thread auf.
hab einmal ein problem mit einer datei gehabt, die hat 344mb gehabt, das problem lag aber nicht an perl, und seiner speicherverwaltung, sondern am betriebssystem
lg, lois
hab einmal ein problem mit einer datei gehabt, die hat 344mb gehabt, das problem lag aber nicht an perl, und seiner speicherverwaltung, sondern am betriebssystem
Die Datei ist max. 5 MByte gross. Aber es kann sein, das einige hundert Leute zum Zeitpunkt X zugreifen und diese Operation mit dem Einfügen auslösen!
Bye,
Steve
Hallo Steve,
Was meinst du, ab wann es denn zu Speicherproblemen kommen kann, wenn die gesamte Textdatei auf einmal geladen wird. I
du kannst mit dem Modul DB_FILE mit der Bindung $DB_RECNO ein Array an eine Textdatei binden. Das Modul ermöglicht z.B. das Auslesen einer Zeile der Datei über $data[$i], das Löschen und natürlich auch das Einfügen von Zeilen. Dabei wird aber jeweils nur der Teil der Datei in den Speicher geladen der gerade benötigt wird. Nach dem Lösen der Bindung werden schließlich alle Änderungen permanent in die Datei geschrieben.
DB_FILE arbeitet mit der in C geschriebenen Berkeley Datenbank Bibliothek - sollte also eigentlich von der Performance her ganz gut sein.
Ein Beispielprogram findest du hier: http://home.kamp.net/home/farid.hajji/bv2/pw/dbfile-lines.pl.html
Grüße,
Peter
»
Was meinst du, ab wann es denn zu Speicherproblemen kommen kann, wenn die gesamte Textdatei auf einmal geladen wird. I
Hi Peter,
ich lese z.B. mit:
open(DATA, "<$FileTxt") || die("can't open/read $FileTxt, $!");
@allRec = <DATA>;
close(DATA) || die("can't close $FileTxt, $!");
die gesamte Textdatei in ein Array um z.B. nach Einträgen zu suchen,
die Anzahl der Zeilen zu ermitteln usw.
Nun denke ich, vielleicht kann es zu Speicherproblemen auf dem Server kommen, wenn dies gleichzeitig ein paar 100 User tun. Also vielleicht doch lieber die Datei zeilenweise abarbeiten und eventuelle eine TMP-Datei verwenden.
Aber das mit dem Modul DB_FILE werde ich mir mal genauer ansehen.
THX
Steve
Hi,
Musst du denn die ganze Datei einlesen?
Wenn nicht, lies doch die Datei Zeilenweise aus, und schreibe die einzelne Zeile sofort wieder. Wenn du bei der Zeile angekommen bist, nach der du etwas einfügen willst, schreib einfach eine Zeile dazwischen, und schreibe danach weiter. Nur, dass du jetzt nat. die Nummern verändern musst.
Die Frage ist nat. ob das notwendig ist. Selbst bei einigen hundert Zeilen, solltest du nicht auf große Datenmengen kommen.
Grüße
Andres Freund
PS: Wenn es wirklich viele Daten sind, könntest du eventuell auch etwas mit "seek" machen, aber da müsste ich erst einmal nachdenken ob das möglich ist.