Thread Zeichenlimit einrichten
(40 answers)
Opened by andy at 2013-05-03 14:53
Hi,
hier mal ein Ansatz. Da diese Such- und Ersetz-Muster üblicherweise stetig mehr werden, kann man sie in einer Tabelle ablegen, die dann leicht erweiterbar ist. Wie Linuxer schon schrieb, ist die Reihenfolge dabei wichtig. Eine Liste gibt es auch für die Wörter, die am Feldende nicht unvollständig stehenbleiben sollen. Hier habe ich noch eine Variante eingebaut, in der man festlegen kann, welche Datenfelder überhaupt bearbeitet werden sollen. Die Prüfung für die Schnipselwörter (GmbH etc.) ist etwas aufwändiger, dafür stellt sie sicher, dass z.B. 'Gm' nur gekappt wird, wenn auch 'bH' folgt. TMTOWTDIT, es ist wirklich nur ein unvollständiger Ansatz. Auf lange Erklärungen verzichte ich mal lieber ... ausführlichere Tests hab ich auch nicht gemacht. Und schau Dir natürlich die Tutorials an (dringend :) 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 57 58 59 60 61 62 use warnings; use strict; my @replacements = ( ['Versicherungs' => 'Vers.-'], ['Versicherung(?:en)?' => 'Vers.'], ['unabhängig(er|es|e)?' => 'unabh.'], ['\(?haftungsbeschränkt\)?' => ''], ['Geschäftsstelle' => 'GSt.'], ); # Wörter, die abgeschnitten werden, falls unvollständig my @cut_incomplete = qw( GmbH Ltd oHG ); my $infile = 'neu.csv'; open (my $infile_fh, '<', $infile) or die "Kann $infile nicht lesen\n"; my $outfile = 'neu2.csv'; open (my $outfile_fh, '>', $outfile) or die "Kann $outfile nicht schreiben\n"; my @output_cols = (0,1,2,3,4); my @replace_cols = (3,4); # diese Spalten sollen bearbeitet werden my $cut_pos_default = 30; # Default-Maximallänge while (my $line = <$infile_fh>) { chomp $line; my @fields = split /;/, $line; # Ersetzungen in gewünschten Spalten erledigen. Wenn das in allen Ausgabe- # spalten sein soll: @replace_cols durch @output_cols ersetzen COLUMN: for my $field (@fields[@replace_cols]) { # Ersetzungen gem. Tabelle for my $sr (@replacements) { $field =~ s{$sr->0}{$sr->1}i; } next COLUMN if length($field) <= $cut_pos_default; # Standard-Maximallänge my $cut_pos = $cut_pos_default; # KOORIGIERT AB HIER # Bah-Wörter am Schluss abschneiden CUT_CANDIDATE: for my $cut_candidate (@cut_incomplete) { my $new_cut_pos = $cut_pos; for (1..length($cut_candidate) - 1) { $new_cut_pos--; if ($field =~ /\A.{$new_cut_pos}$cut_candidate/) { $cut_pos = $new_cut_pos ; last CUT_CANDIDATE; } } } # BIS HIER # Länge begrenzen $field =~ s{(.{$cut_pos}).*}{$1}; # falls gewünscht: Whitespace am Ende kappen $field =~ s/\s+$//; } print $outfile_fh join(';', @fields[@output_cols]) . "\n"; } edit: Die Wortstummel-Entfernung funktionierte nicht korrekt (Denkfehler bei der Verwendung von pos()), korrigierter Bereich ist markiert. P.S.: Ist Dir klar, dass die Spaltenzählung (der Array-Index) nicht bei 1, sondern bei 0 beginnt? (just in case ...) Editiert von FIFO: ein Pattern in der Tabelle korrigiert Editiert von FIFO: argh, edit per iPad geht garnicht ... Typo Last edited: 2013-05-17 00:44:59 +0200 (CEST) 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"
|