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

Zeile in Textdatei austauschen??

Leser: 4


<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
Gast Gast
 2006-04-25 11:09
#65291 #65291
Hallo an alle,
ich lese eine Textdatei aus und gebe gewisse Zeilen zur Bearbeitung in Textfelder (WIN-GUI) aus.
Jetzt möchte ich eine Funktion die es mir möglichst einfach macht diese Zeile in der Datei zu tauschen, sprich zu bearbeiten.

Ich habe leider wenig Ahnung von Datei Zeigern, denke aber dass es mit so was gehen sollte.

Irgendwie so:
Zeile auslesen
Position merken
Zeile verändern
An der Position ersetzen

Hat mir jemand eine gute Idee?

vielen Dank schon mal

Andreas
master
 2006-04-25 11:15
#65292 #65292
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Ist die Textdatei vorbgegeben?

Ist es eine CSV datei? wenn ja, kannst du sie lesen, splitten. bearbeiten, speichern.

Ansonsten versuche eine CSV (oder CSV ähnliche Datei) zu machen.

Kurz zeig mal den Aufbau der Textdatei...
---------


Schreib einfach die ganze Datei neu.

sonst musst du wohl zu sysopen greiffen und
byte für byte arbeiten... aber das wäre wohl unpassend.

Ich vermute es sind nicht sooo viele Zeilen... Solange die Datei
nicht hunderte von MB's gross ist. kannst du sieh ruhig neuschreiben..

also:
1. komplett lesen
2. Splitten nach einem zeichen (z. B. Zeilenumbruch)
Dann hast du die zeilen in einem @Array...

3. im Array z. b. die Zeile 3 ( $array[3] ) ändern
4. mit join("\n",@array) zusammensetzen und dann wieder schreiben\n\n

<!--EDIT|master|1145949878-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
Andreas
 2006-04-25 11:22
#65293 #65293
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Hallo @master,
die Textdatei ist ein Programm, dass ich mit einem Script automatisiert bearbeite, nur gibt es eben zeilen die vor der Bearbeitung verifiziert werden müssen und händisch geändert werden.
D.h. leider ist das Format nicht im Voraus bekannt.

Also muss ich die Zeile lesen, in ein Texteld bringen, bearbeiten lassen und die alte Zeile gegen den ihnalt des Textfeldes austauschen.

Gruß
Andreas
bloonix
 2006-04-25 11:25
#65294 #65294
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hallo,

[quote=Guest,25.04.2006, 09:09]Hat mir  jemand eine gute Idee?[/quote]

ob die Idee gut ist, musst du selbst bestimmen...

Wenn die Textbausteine, die gesucht und ersetzt werden
sollen, die gleiche Zeichenlänge haben, dann kannst du eine
Datei direkt editieren. Mit tell (Position merken) und seek (zur
Position springen) kannst du Zeichen ab einer bestimmten
Position verarbeiten + bearbeiten.

Wenn die Zeichenlänge allerdings unterschiedlich ist, dann
wird dir wahrscheinlich nichts anderes übrig bleiben, als Datei A
auszulesen und den neuen Inhalt nach Datei B zu schreiben.
Was du nicht tun solltest, ist Datei A komplett einlesen!
Besser wäre Datei A zum lesen öffnen, Datei B zum schreiben
öffnen und dann Zeilenweise von A nach B zu schreiben.
Beispiel:

Code (perl): (dl )
1
2
3
4
5
6
7
8
open A, '<', './DateiA' or die $!;
open B, '>', './DateiB' or die $!;
while (<A>) {
   s/suche/ersetze/;
   print B;
}
close A;
close B;


Wenn du das Beispiel mit tell und seek vorziehst und du
tatsächlich Textbausteine mit gleichen Längen ersetzen
willst, dann muss ich mein Beispiel nochmal aktualisieren :)

Greez,
opi\n\n

<!--EDIT|opi|1145951489-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
master
 2006-04-25 11:29
#65295 #65295
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
Ok...
Dann 2 Möglichkeiten.. (wenn ichs richtig verstanden habe)


Methode A:
Zeile lesen, und per "regexp" den alten Text durch neuen ersetzten.

Methode B:
alten satz auslesen, dann in Datei markieren mit z. B.
[HIER]
dann im nachhinen wenn es geändert wurde das nach [Hier]
suchen und ersetzen. Ist sicherer als Methode A sein.


Bei mehreren Zeilen gleichzeitig einfach ein [HIER1]
[HIER2]  z.b.\n\n

<!--EDIT|master|1145950473-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
master
 2006-04-25 11:33
#65296 #65296
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@opi

genau das habe ich auch vorgeschlagen..

Wobei deine Methode meiner "A" entspricht..
es ist gefährlich per regexp die Sätze zu ersetzen.

Besser Methode B....

Die Datei A kann er aber ruhig ganz einlesen, parsen, ändern ... und neuschreiben.

Wenn er nach Zeilen gehen kann, kann er ja erst nach \n splitten...

@Andreas wie gross wird die Datei ca.?
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
renee
 2006-04-25 11:34
#65297 #65297
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du kannst Dir auch zu der Zeile, die Du bearbeiten willst, die Zeilennummer merken und dann die Datei mit CPAN:Tie::File verändern:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
use Tie::File;

my %zeilen_hash = (5 => 'Neue Zeile 5',
25 => 'Ich bin der neue Text für Zeile 25');

tie my @array,'Tie::File', $datei or die $!;
for my $key(keys(%zeilen_hash)){
$array[$key-1] = $zeilen_hash{$key};
}
untie @array;
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
master
 2006-04-25 11:36
#65298 #65298
User since
2003-10-20
610 Artikel
BenutzerIn
[default_avatar]
@renee
Die Zeilennummer ist in meiner version äquivalent zum Array-index.

Wobei TIE auch eine Lösung ist.

@Adreas:

Vor und nach dem "Satz" in der Zeile sollte es doch ev. eine art Feldermarkierung geben. Zeig uns mal eine Beispielzeile.\n\n

<!--EDIT|master|1145950687-->
$i='re5tsFam ^l\rep';$i=~s/[^a-z| ]//g;$\= reverse "\U!$i";print;
bloonix
 2006-04-25 11:43
#65299 #65299
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=master,25.04.2006, 09:33]@opi

genau das habe ich auch vorgeschlagen..[/quote]
be cool master, als ich meine Antwort begonnen habe, stand
deine noch nicht da.

[quote=master,25.04.2006, 09:33]Die Datei A kann er aber ruhig ganz einlesen ...[/quote]

Na klar master, kann er. Er könnte dieses Stück Code auch als
Funktion betrachten und irgendwann mal auslagern wollen,
weil er dieses Stück Code gerne woanders verwenden möchte.
Na aber dann kommt irgendwann mal eine Datei, die 500 MB
groß ist... und da er gefragt hat, ob jemand eine gute Idee
hat, habe ich versucht, diesen Gedanken einfließen zu lassen.

Stichwort: Wiederverwendbarkeit.

Danke. ;)\n\n

<!--EDIT|opi|1145951321-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
renee
 2006-04-25 11:46
#65300 #65300
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=master,25.04.2006, 09:33][...]
Besser Methode B....

Die Datei A kann er aber ruhig ganz einlesen, parsen, ändern ... und neuschreiben.

Wenn er nach Zeilen gehen kann, kann er ja erst nach \n splitten...
[...][/quote]
So allgemein kannst Du es nicht sagen. Ich würde immer davon abraten, eine Datei komplett einzulesen - das kostet mehr Speicher und ist auch langsamer...

Wie meinst Du das mit dem splitten?? Wo willst Du noch splitten?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2006-04-25 11:09.