Thread Linux anonymisierer (35 answers)
Opened by sd911 at 2016-09-19 08:10

GwenDragon
 2016-09-21 15:15
#185417 #185417
User since
2005-01-17
14510 Artikel
Admin1
[Homepage]
user image
Weiterer Versuch dir zu helfen.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use utf8;
use Getopt::Long;

sub help {
    print <<TXT;

$0 Version 0.1 

Ersetzt in separiereten Datenzeilen den Originalinhalt von Datenspalten durch einen anderen.
Das Programm funktioniert mit Umleitung auf der Kommandozeile.

Aufruf:
        $0 -F feldnr=ersatz < eingabedatei > ausgabedatei
        $0 -FS=separator -F feldnr=ersatz < eingabedatei > ausgabedatei
        oder
        $0 -?   

Hinweis: 
        Feldnummern fangen bei 0 an!

Beispiele für Parameter:
        -?                     die Hilfe
        -h                     die Hilfe
        -FS=;                  benutzt den Strichpunkt als Trenner für die Datenspalten
        -F 3=""                ersetzt das vierte Feld durch leeren Inhalt bei Zeichenketten oder Zufallszahlen bei Zahleninhalt
        -F 9=                  ersetzt das neunte Feld durch leeren Inhalt bei Zeichenketten oder Zufallszahlen bei Zahleninhalt
        -F 1=!!!               ersetzt das zweite Feld durch !!!
        -F 0=XXXXXXX -F 4=???? ersetzt das erste Feld durch XXXXXXX und das fünfte druch ????
        -F 0=XXX -F 9="Blah Blubb" ersetzt das erste Feld durch XXX und das 10te durch 'Blah Blubb'
        
TXT
    exit 255;
}

my @feldparameter;
my $separator;
GetOptions(
    'F=s'  => \@feldparameter,  # -F Spaltenparameter für Spalte + Ersetzung
    'FS=s' => \$separator,              # -FS ist Feld/Spalten-Separator
    'h|?'  => \&help                    # -? ist Hilfe
);

$separator //= ';'; # Defaultseparator ist der Strichpunkt

### Datenzeilen einlesen
while ( my $line = <> ) {
    my @daten_zeile = split /$separator/, $line; # separierte Datenzeile in einzelen Werte
    chomp @daten_zeile;
    
        ### in Datenzeilen ersetzen
        for my $feld_parameter (@feldparameter) {    # für alle Feldparameter 
        my ( $FELDNR, $WERT ) = split /=/,$feld_parameter;    # Parameter in Feldnr und -wert
        $WERT //= ""; # falls Parameterwert undefiniert dann leere Zeichenkette zuweisen

        if ( $FELDNR < scalar @daten_zeile ) {   # Prüfen ob Feldnr gültig

            if ( $daten_zeile[$FELDNR] =~ /\D/ ) # wenn Daten darin nicht nur Ziffern enthalten
            {    
                $daten_zeile[$FELDNR] = $WERT;   # dann mit Wert aus Parameter ersetzen
            }
            else {                                       # Daten sind alles Ziffern
                if ( not length $WERT ) {                # falls neuer Wert leere Zeichenkette
                    $WERT = int( rand(1_000_000_000) );  # dann durch Zufallszahlen ersetzen
                }
                $daten_zeile[$FELDNR] = $WERT;           # neuen Wert in Datenspalte speichern
            }
        }
        else {
            die "Paramater '$feld_parameter' ist ungültig/zu groß!\n"
              . "Es existieren nur Feldnummern von 0.."
              . scalar @daten_zeile;
        } 
                
    }

    #### neue Daten wieder ausgeben
        print join( $separator, @daten_zeile ) . "\n";    
}



Ich hoffe, das ist jetzt was du wolltest. ;)
Last edited: 2016-09-21 15:27:50 +0200 (CEST)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

View full thread Linux anonymisierer