Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7440[/thread]

dateiinhalt mit seek usw bearbeiten



<< >> 10 Einträge, 1 Seite
Froschpopo
 2005-11-06 20:38
#59783 #59783
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Also wir hatten ja diese schöne diskusion mit dem Filelocking.
Das Problem habe ich jetzt zwar mit sysopen() in den Griff bekommen, aber jetzt wollte ich trotzdem nochmal die andere angesproche Version ausprobieren.
Gehen wir mal von folgender Basis aus die ich bisher verwendet hatte:
Code: (dl )
1
2
3
4
5
6
7
8
9
open(OLDFILE, "/home/froschpopo/file.txt") or die $!;
flock OLDFILE, 2;
@content = <OLDFILE>;
close(OLDFILE);

open(FILE, ">/home/froschpopo/file.txt") or die $!;
flock FILE, 2;
print FILE @content;
close(FILE);

Wie könnte ich denn jetzt eine zeile in der Datei ändern, ohne diese zu löschen?

nehmen wir mal an, die datei sieht so aus:
Code: (dl )
1
2
3
name|alter
name2|alter2
name3|alter3

wie ändere ich jetzt name2 ohne dass ich wie im obigen primatenbeispiel die datei neu erstellen muss?\n\n

<!--EDIT|Froschpopo|1131302342-->
pq
 2005-11-06 20:44
#59784 #59784
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
nun ja, du könntest Wiki:Wie sperre ich eine Datei als ausgangsbasis verwenden und ein bisschen selbstinitiative zeigen oder aber einfach warten, bis dir doch jemand hier den code verwendungsfertig unter die nase reibt.\n\n

<!--EDIT|pq|1131302666-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Strat
 2005-11-07 14:54
#59785 #59785
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Tie::File ?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
ptk
 2005-11-07 15:12
#59786 #59786
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=Strat,07.11.2005, 13:54]Tie::File ?[/quote]
Damit geht es, aber das Modul versteckt die Tatsache, dass die Datei trotzdem neu angelegt werden muss oder wenigstens zu großen Teilen neu geschrieben werden muss. Wenn man das nicht möchte, muss man ein DB-System verwenden.
master
 2005-11-07 15:17
#59787 #59787
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Sofern du weisst "wo" der wert steht, kannst du ja sysopen und seek benutzen.

Ich würde aber besser die ganze DB neu schreiben...
Zudem würde "seek" auch noch das problem bringen, dass du dann das was "nachher kommt" überschreibst....

Du kommst kaum daran vorbei die ganze Datei neu zu schreiben, weil du ja Änderungen nicht am Ende anhängst sondern mitten drin machst. Also müssen ja die Nachfolgenden Bytes alle um 1 Stelle verschoben werden, wenu du da ein zusätzliches reinhängst.
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
pq
 2005-11-07 15:39
#59788 #59788
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
ich denke, das größte problem von froschpopo ist, die datei zweimal zu öffnen.
dass man dann den inhalt ab der zu ändernden stelle nochmal neu schreiben muss,
ist ein zweites problem, aber ein geringeres. es wirkt sich auf die performance
aus.
eine db zu verwenden, hatte ich ja auch schon in einem anderen froschpopo-thread
vorgeschlagen, aber er will ja nicht.

edit: typo\n\n

<!--EDIT|pq|1131379242-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
ptk
 2005-11-07 17:23
#59789 #59789
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Eine Möglichkeit wäre, eine zu löschende Zeile einfach ungültig zu machen, also z.B. mit Spaces aufzufüllen. Dann entfällt das Umkopieren, allerdings muss die Applikation darauf vorbereitet sein. Und mit der Zeit würde sich ziemlich viel Schrott ansammeln, so dass ab und zu ein Aufräumen der ungültigen Zeilen notwendig wäre.
Froschpopo
 2005-11-07 18:00
#59790 #59790
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Also ich hab mich mal etwas belesen und hätte folgende Idee:

ich lese erst die Datei in ein Array ein. Jede Zeile bekommt einen eigenen INDEX im Array. Der INDEX der zu bearbeitenden Zeile ist ja dann logischerweise auch die Zeile in der Datei, auf die ich dann so zugreifen kann.

Zitat: "Zudem würde "seek" auch noch das problem bringen, dass du dann das was "nachher kommt" überschreibst.... "
Aber doch nicht, wenn ich einen zeilenumbruch setze oder?

Mein nächster Vorschlag: truncate()
Datei in Array lesen, truncate auf 0 machen und dann das array wieder reinschreiben.

Was sagt ihr dazu?\n\n

<!--EDIT|Froschpopo|1131379290-->
pq
 2005-11-07 18:03
#59791 #59791
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Froschpopo,07.11.2005, 17:00]Mein nächster Vorschlag: truncate()
Datei in Array lesen, truncate auf 0 machen und dann das array wieder reinschreiben.[/quote]
ich weiß ja nicht, ob du nie auf links klickst, die man dir so anbietet.
ich schrieb dir den link Wiki:Wie sperre ich eine Datei?. darin ist ein seek auf anfang entahlten und ein
truncate auf 0. langsam hab ich keine lust mehr, aber offensichtlich noch genug andere.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Froschpopo
 2005-11-08 02:11
#59792 #59792
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
also ich habs jetzt so gelöst, als dass ich die file komplett truncate und dann nochmal neu reinschreibe.
<< >> 10 Einträge, 1 Seite



View all threads created 2005-11-06 20:38.