Thread Präfixe rausschreiben (7 answers)
Opened by Philipp at 2012-04-29 13:14

FIFO
 2012-04-30 08:26
#157954 #157954
User since
2005-06-01
469 articles
BenutzerIn

user image
Ich glaube, ich werde Perl6 mögen :) Dein Beispiel lässt übrigens den Fall mit den Zahlenbereichen aus (52-54,...).

@Philipp: Hier eine Version mit "richtigen" Dateien und etwas Fehlervermeidung, außerdem ist die Sortierung jetzt arithmetisch und nicht alphabetisch (falls Du Sortierung überhaupt brauchst):

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
47
48
49
50
51
52
53
54
55
56
use warnings;
use strict;

my $in_file  = "DeineDatei.csv";
my $out_file = "DeineAndereDatei.csv";

my %new_lines;
my $regex = qr[
    \A (.+?) \t     # zwischen Anfang und erstem TAB => $key
    (\d+)           # $prefix
    (?:             # Klammern nicht behalten
      \(            # (
        (.+?)       # Inhalt zwischen Klammern => $extension
      \)            # )
    )?              # nur falls vorhanden
]x;

open (my $in_fh, '<', $in_file) or die "kann $in_file nicht lesen!\n";

while (my $line = <$in_fh>) {
    my ($key, $prefix, $extension) = $line =~ /$regex/;
    if (defined $extension) {
        my @extensions = split(/,/, $extension);
        ITEM:
        for my $item (@extensions) {
            # Zahlenbereich angegeben?
            if ($item =~ /(\d+)-(\d+)/) {
                if ($2 < $1) {
                    print "fehlerhafte Bereichsangabe: '$item' in Zeile $.\n";
                    next ITEM;
                }
                for my $i ($1..$2) {
                    push @{$new_lines{$key}}, "$prefix$i";
                }
            }
            elsif ($item =~ /(\d+)/) {  # nur Zahlen verwenden
                push @{$new_lines{$key}}, "$prefix$1";
            }
        }
    }
    else {
        push @{$new_lines{$key}}, "$prefix";
    }
}
close($in_fh);

open (my $out_fh, '>', $out_file) or die "kann $out_file nicht schreiben!\n";

for my $key (sort {$a <=> $b} keys %new_lines) {
    for my $value (sort {$a <=> $b} @{$new_lines{$key}}) {
        print $out_fh "$key\t$value\n";
    }
}
close($out_fh);

print "fertig.\n";


Gruß FIFO
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"

View full thread Präfixe rausschreiben