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

Linuxer
 2013-05-16 11:16
#167608 #167608
User since
2006-01-27
3891 Artikel
HausmeisterIn

user image
Naja, Du hast 3 Schritte, die Du auf jede Zeile der Quelldatei anwenden willst.

Warum also nicht diese 3 Schritte beim ersten Einlesen der Quelldatei erledigen?

Die Reihe von Ersetzungen könnte man verkürzen, indem man Alternativen verwendet.

Außerdem steckt da noch ein potentieller Fehler drin; die runden Klammern müssen maskiert werden, wenn sie als Zeichen verwendet werden sollen.

Empfohlene Dokumentation:
http://perldoc.perl.org/perlretut.html
http://perldoc.perl.org/perlre.html
http://perldoc.perl.org/perlrequick.html


Hier mal ein Versuch einer Korrektur und Zusammenfassung. Ohne Gewähr, da ungetestet.

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
#!/usr/bin/perl
use warnings;
use strict;

my $infile = 'Partnerlist_05_13.csv';
my $outfile = 'neu.csv';

open my $INFH, '<', $infile or die "open(ro,$infile): $!\n";
open m< $OUTFH, '>' $outfile or die "open(w,$outfile): $!\n";

while (local $_ = <$INFH>) {

    # Teil 1
    s{Versicherungsmakler}{Vers.-Makler}i;
    # Reihenfolge der Alternativen ist wichtig
    s{Versicherung(?:s-?|en|)}{Vers.-}i;
    # da Gross/klein egal ist (/i), braucht es kein Match für "Unab.."
    s{unabhängig(?:er?)}{unabh.}i;
    s{Geschäftsstelle}{GSt.}i;
    # () als Suchstring muessen maskiert werden!
    s{\(?haftungsbeschränkt\)?}{}i;

    # Teil 2
    chomp;
    my @fields = split /;/, $_;
    for my $field ( @fields ) {
        if ( length($field) > 30 ) {
            $field = substr($field, 0, 30 );
        }
    }
    # $/ wurde durch chomp() entfernt, hier fuegen wir es wieder an
    $_ = join( ';', @fields ) . $/;

    # Teil 3
    # dort wo "Gmb" oder "Gm" oder "G" als Wort endet, wird es entfernt
    # kann klappen, muss aber nicht; ein "GmbH & Co KG" verliert auch das letzte "G" !!!!
    s{(?Gmb|Gm|G)\b}{}g;

    # daher vielleicht lieber auch vorne auf Wortgrenze pruefen
    #s{\b(?Gmb|Gm|G)\b}{}g;


   print OUTFH;
}
close $INFH;
close $OUTFH or die "close($outfile): $!\n";

Last edited: 2013-05-16 11:35:36 +0200 (CEST)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Zeichenlimit einrichten