Thread Zeile in Datei bearbeiten (12 answers)
Opened by hudo at 2007-08-29 14:02

bloonix
 2007-08-29 15:44
#98825 #98825
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
ein kleines Beispiel (bitte mit Testdaten ausprobieren) ...
und vorausgesetzt, dass die Zeilen wirklich eine fixe Länge
haben!

# cat test.txt
----0---m---28.07.2007---23:13:18---rest---id=123456
----7---a---28.07.2007---23:13:46---rest---id=345677
----0---a---28.07.2007---23:13:57---rest---id=876543
----8---a---28.07.2007---23:14:57---rest---id=876544
----0---a---28.07.2007---23:15:57---rest---id=876545
----9---a---28.07.2007---23:16:57---rest---id=876546


Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use strict;
use warnings;

my $len = 53; # Zeilenlänge
my %nmb =     # Nummern, die geändert werden sollen
    map { $_ => undef } (7, 8, 9); 

open my $fh, '+<', 'test.txt' or die $!; 

while ( my $line = <$fh> ) { 
    my $nmb = substr($line, 0, 5);  # die ersten 5 Zeichen
    $nmb =~ s/^-+//g;               # Bindestrich entfernen
    if (exists $nmb{$nmb}) {        # wenn die Zeile geändert werden soll
        my $pos = tell($fh);        # Position des Zeilenendes merken
        seek($fh, $pos - $len, 0);  # Zum Anfang der Zeile springen
        $nmb = sprintf('%5s', 10);  # Kontainer
        $nmb =~ tr/ /-/;            # Leerzeichen ersetzen
        print $fh $nmb;             # erste Spalte ersetzen
        # nun befinden wir uns an Position 5

        # Datum + Uhrzeit
        my ($sec,$min,$hour,$mday,$mon,$year) = localtime;
        $year += 1900;
        $mon  += 1;

        # zu Position 9 springen, da wo das Datum anfängt und Datum + Uhrzeit schreiben
        seek($fh, 4, 1); 
        print $fh sprintf('---%02d.%02d.%04d', $mday, $mon, $year);
        print $fh sprintf('---%02d:%02d:%02d', $hour, $min, $sec);

        # zur Position springen, wo die ID anfängt
        seek($fh, 7, 1); 

        # die ID Filtern, +1, Kontainer erzeugen, Leerzeichen ersetzen
        my $id = substr($line, 40, 12);
        $id =~ s/^-*id=//;
        $id = sprintf('%12s', "id=" . ++$id);
        $id =~ tr/ /-/;
        print $fh $id;

        # zum gemerkten Zeilende springen, dass ist hinter dem Newline
        seek($fh, $pos, 0); 
    }   
}

close $fh;


# cat test.txt
----0---m---28.07.2007---23:13:18---rest---id=123456
---10---a---29.08.2007---13:43:40---rest---id=345678
----0---a---28.07.2007---23:13:57---rest---id=876543
---10---a---29.08.2007---13:43:40---rest---id=876545
----0---a---28.07.2007---23:15:57---rest---id=876545
---10---a---29.08.2007---13:43:40---rest---id=876547
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.

View full thread Zeile in Datei bearbeiten