Thread Zeichenlimit einrichten (40 answers)
Opened by andy at 2013-05-03 14:53

FIFO
 2013-05-16 14:00
#167612 #167612
User since
2005-06-01
469 Artikel
BenutzerIn

user image
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"

View full thread Zeichenlimit einrichten