Thread Präfixe rausschreiben
(7 answers)
Opened by Philipp at 2012-04-29 13:14
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"
|