1 2 3 4 5 6 7 8 9
use 5.14.0; my $muster = "Hier langer Vorname 50#Hier der 50er Nachname #"; say "Vorname: ", substr($muster, 0, 50); say "Nachname: ", substr($muster, 51, 50); say "Zeile vorher: ", $muster; substr($muster, 0, 50) = "!" x 50; substr($muster, 51, 50) = "*" x 50; say "Zeile nachher: ", $muster;
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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
#!/usr/bin/perl ### Notwendige Module laden use strict; # überprüfe programm vor ablauf strikt auf Fehler use warnings; # und gib auch Fehler aus use utf8; # erlaube UTF-Zeichen in Quelltext ### Modul für das Erfassen der Kommandozeilenparameter deklarieren use Getopt::Long; ### Variablen deklarieren my $name; my $prename; my $filename; ### Ersatzstring aus 50mal Zeichen '-' definieren my $c50 = '-' x 50; ### Unterprogramm für Hilfetext definieren sub help { print <<TXT; !!!! FEHLER !!!! Aufruf: ReName -p "Vorname" -n "Name" -f "Dateiname" Notwendige Parameter sind: -p oder -n und -f Folgende Parameter sind gültig: -p für Vorname --vorname -n für Name --name --datei für Dateinamen der Eingabedatei -f TXT exit 255; # Programmabbruch } ### Art der Kommandozeilenparameter definieren my %opts = ( 'vorname|p=s' => \$prename, # Parameter Vorname als String 'name|n=s' => \$name, # Parameter Name als String 'datei|f=s' => \$filename # Parameter Dateiname der einzulesenden Datei als String ); ### Parameter einlesen GetOptions(%opts); ### Vorhandensein der Parameter prüfen if ( not defined($name) and not defined($prename) ) { help(); # bei fehlenden Parametern Hilfe anzeigen } ### Eingabedatei öffnen my $in_fh; open $in_fh, '<', $filename # im Lesemodus öffnen or die "Datei '$filename' kann nicht geöffnet werden: $!" ; # bei Fehlschlag Fehler ausgeben ### Ausgabedatei öffnen my $out_fh; my $out_filename = "$filename.tmp"; # temporärer Dateiname open $out_fh, '>', $out_filename # im Schreibmodus öffnen or die "Datei '$out_filename' kann nicht erzeugt werden: $!" ; # bei Fehlschlag Fehler ausgeben flock $out_fh, 0; # Datei gegen mehrfachen Zugriff sperren ### Eingabedatei einlesen while ( my $line = <$in_fh> ) { # Zeilenweise in Variable $line einlesen if (length $name # falls Parameter $name vorhanden and $line =~ /#\Q$name\E\s*Name#/ ) # und $name mit möglichen nachfolgenden Leerzeichen in $line vorhanden { $line =~ s/#\Q$name\E\s*Name/#${c50}Name/ ; # ersetze das Vorkommen durch den Ersatzstring } if (length $prename # falls Parameter $prename vorhanden and $line =~ /#\Q$prename\E\s*Vorname#/ ) # und $prename mit möglichen nachfolgenden Leerzeichen in $line vorhanden { $line =~ s/#\Q$prename\E\s*Vorname/#${c50}Vorname/; # ersetze das Vorkommen durch den Ersatzstring } print $out_fh $line; # speichere neue Zeile in Ausgabedatei } ### Eingabedatei schließen close $in_fh or die "Datei '$filename' kann nicht geschlossen werden: $!"; # bei Fehlschlag Programmabbruch mit Fehlermeldung ### Ausgabedatei schließen close $out_fh or die "Datei '$out_filename' kann nicht geschlossen werden: $!"; # oder bei Fehlschlag Programmabbruch mit Fehlermeldung # alte Eingabedatei löschen unlink $filename or die "Datei '$filename' kann nicht gelöscht werden!"; # Ausgabedatei in Dateinamen der Eingabedatei umbenennen rename ($out_filename, $filename) # umbenennen or die "Datei '$out_filename' kann nicht in '$filename' umbenannt werden!"; # oder Programmabbruch mit Fehlermeldung 1;
V001#62102200100011#6#210#2#20#01#0001#1#06#2016#01#Denis #19570103#20160601#99999999#Koch # #Berlin #0# # #000000000000191022#000000000000149498#
1
2
3
4
5
6
my $zeile = 'V001#62102200100011#6#210#2#20#01#0001#1#06#2016#01#Denis #19570103#20160601#99999999#Koch # #Berlin #0# # #000000000000191022#000000000000149498#
';
my @daten_zeile = split /#/, $zeile;
# Daten des ersten Felds
my $daten_erstes = $daten_zeile[0];
1
2
3
4
5
6
7
8
9
10
11
12
13
### Eingabedatei öffnen
foreach my $in_fh = (@ARGV) {
#my @daten_zeile = split /#/, $zeile;
my $sum = 0;
open(my $data, '<', $in_fh) or die "Could not open '$in_fh' $!\n";
while (my $line = <$data>) {
chomp $line;
my @fields = split "," , $line;
$out_fh += $fields[2];
}
Guest sd911Ich wollte das mit foreach und split realisieren
(...)
Bisher noch nicht so erfolgreich...
Wie müsste das dann aussehen?
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
my $name;
my $prename;
my $filename;
my $c50 = '-' x 50;
sub help {
print <<TXT;
!!!! FEHLER !!!!
Aufruf:
ReName -p "Vorname" -n "Name" -f "Dateiname"
Notwendige Parameter sind:
-p oder -n
und -f
Folgende Parameter sind gültig:
-p für Vorname
--vorname
-n für Name
--name
--datei für Dateinamen der Eingabedatei
-f
TXT
exit 255; # Programmabbruch
}
#my %opts = (
# 'vorname|p=s' => \$prename, # Parameter Vorname als String
# 'name|n=s' => \$name, # Parameter Name als String
# 'datei|f=s' =>
# \$filename # Parameter Dateiname der einzulesenden Datei als String
#);
GetOptions(%opts);
if ( not defined($name) and not defined($prename) ) {
help(); # bei fehlenden Parametern Hilfe anzeigen
}
### Eingabedatei öffnen
foreach my $in_fh = (@ARGV) {
#my @daten_zeile = split /#/, $zeile;
my $sum = 0;
open(my $data, '<', $in_fh) or die "Could not open '$in_fh' $!\n";
while (my $line = <$data>) {
chomp $line;
my @fields = split "," , $line;
$out_fh += $fields[2];
}
# Daten des ersten Felds
#my $daten_erstes = $daten_zeile[0];
}
open $in_fh, '<', $filename # im Lesemodus öffnen
or die "Datei '$filename' kann nicht geöffnet werden: $!" ; # bei Fehlschlag Fehler ausgeben
### Ausgabedatei öffnen
my $out_fh;
my $out_filename = "$filename.tmp"; # temporärer Dateiname
open $out_fh, '>', $out_filename # im Schreibmodus öffnen
or die "Datei '$out_filename' kann nicht erzeugt werden: $!" ; # bei Fehlschlag Fehler ausgeben
flock $out_fh, 0;
### Eingabedatei einlesen
#while ( my $line = <$in_fh> ) { # Zeilenweise in Variable $line einlesen
#
# if (length $name # falls Parameter $name vorhanden
# and $line =~ /#\Q$name\E\s*Name#/
# ) # und $name mit möglichen nachfolgenden Leerzeichen in $line vorhanden
# {
# $line =~ s/#\Q$name\E\s*Name/#${c50}Name/
# ; # ersetze das Vorkommen durch den Ersatzstring
# }
#
# if (length $prename # falls Parameter $prename vorhanden
# and $line =~ /#\Q$prename\E\s*Vorname#/
# ) # und $prename mit möglichen nachfolgenden Leerzeichen in $line vorhanden
# {
# $line =~ s/#\Q$prename\E\s*Vorname/#${c50}Vorname/; # ersetze das Vorkommen durch den Ersatzstring
# }
print $out_fh $line; # speichere neue Zeile in Ausgabedatei
}
### Eingabedatei schließen
close $in_fh
or die "Datei '$filename' kann nicht geschlossen werden: $!"; # bei Fehlschlag Programmabbruch mit Fehlermeldung
### Ausgabedatei schließen
close $out_fh
or die "Datei '$out_filename' kann nicht geschlossen werden: $!"; # oder bei Fehlschlag Programmabbruch mit Fehlermeldung
# alte Eingabedatei löschen
#unlink $filename or die "Datei '$filename' kann nicht gelöscht werden!";
# Ausgabedatei in Dateinamen der Eingabedatei umbenennen
#rename ($out_filename, $filename) # umbenennen
# or die "Datei '$out_filename' kann nicht in '$filename' umbenannt werden!"; # oder Programmabbruch mit Fehlermeldung
1;
1
2
3
4
5
6
7
8
9
10
V001;62102200100011;6;210;2;20;01;0001;1;06;2016;01;Bergt ;19570103;20160601;99999999;Lenny ; ;Berlin ;0; ; ;000000000000191022;000000000000149498;
V001;62102200100011;6;210;2;20;01;0001;1;06;2016;02;Bonn ;19551005;20160401;99999999;Lenny2 ; ;Bielefeld ;1; ; ;000000000000191023;000000000000149499;
V001;62102200100011;6;210;2;20;01;0001;1;07;2016;01;Dortmund ;19570103;20160601;99999999;Lenny3 ; ;Leipzig ;0; ; ;000000000000191022;000000000012382652;
V001;62102200100011;6;210;2;20;01;0001;1;07;2016;02;Erwitte ;19551005;20160401;99999999;Lenny4 ; ;Dortmund ;1; ; ;000000000000191023;000000000012382653;
V001;62102200100011;6;210;2;20;01;0001;1;08;2016;01;Berlin ;19570103;20160601;99999999;Lenny5 ; ;Dortmund ;0; ; ;000000000000191022;000000000000149498;
V001;62102200100011;6;210;2;20;01;0001;1;08;2016;02;Berlin ;19551005;20160401;99999999;Lenny6 ; ;Berlin ;1; ; ;000000000000191023;000000000000149499;
V001;62102200100011;6;210;2;20;01;0001;1;09;2016;01;Dortmund ;19570103;20160601;99999999;Lenny7 ; ;Berlin ;0; ; ;000000000000191022;000000000000149498;
V001;62102200100011;6;210;2;20;01;0001;1;09;2016;02;Bergt ;19551005;20160401;99999999;Lenny8 ; ;Bielefeld ;1; ; ;000000000000191023;000000000000149499;
V001;62102200100020;6;210;2;20;01;0002;0;06;2016;01;Berlin ;19711225;20140301;99999999;Lenny9 ; ;Berlin ;0; ; ;000000000000191032;000000000000149500;
V001;62102200100020;6;210;2;20;01;0002;0;06;2016;02;Berlin ;19750407;20120201;99999999;Lenny10 ; ; ;1; ; ;000000000000191033;000000000000149501;
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"; }
use 5.010;
QuoteMir ist gerade aufgefallen das ich 2 Dateien habe ( die immer gleich heißen) g210.csv und kd63.csv.
in der g210.csv wird immer das 5. Feld durch Random Zahlen ersetzt und das 18 Feld durch "VORNAME".
Und bei der kd63.csv das 6. Feld "VORNAME" und das 10. IBAN durch Random Zahlen.
FILE = g210.csv; anonymizer.pl -F 4= -F 17=VORNAME < $FILE > $FILE.new ;
FILE = kd63.csv; anonymizer.pl -F 5=VORNAME -F 10= < $FILE > $FILE.new ;
1
2
3
4
5
6
7
#!/bin/bash
FILE = g210.csv;
anonymizer.pl -F 4= -F 17=VORNAME < $FILE > $FILE.new ;
FILE = kd63.csv;
anonymizer.pl -F 5=VORNAME -F 10= < $FILE > $FILE.new ;
1
2
3
4
5
6
7
8
9
#!/bin/bash
for FILE in *.csv ;
do
if [ $FILE -ne "kd63.csv" && $FILE -ne "g210.csv" ] ;
then
anonymizer.pl -F 4= -F 17=VORNAME < $FILE > $FILE.new ;
fi
done
1
2
3
4
5
6
7
#!/bin/bash
FILE = g210.csv;
anonymizer.pl -F 4= -F 17=VORNAME < $FILE > $FILE.new ;
FILE = kd63.csv;
anonymizer.pl -F 5=VORNAME -F 10= < $FILE > $FILE.new ;
1
2
3
4
#!/bin/bash
FILE = sa10p.txt;
anonymisierer_final.pl -F 4= -F 17=VORNAME < $FILE > $FILE.txt ;
1
2
./daily-anonym.sh: line 3: FILE: command not found
./daily-anonym.sh: line 4: $FILE: ambiguous redirect
anonymizer.pl -F 4= -F 17=VORNAME < $FILE > $FILE.new ;