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"; }