1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO FOO (
ID
, NAME
)
SELECT
MY_SEQUENCE.nextval
, 'BAR'
FROM
dual
left join FOO on
FOO.NAME = 'BAR'
WHERE
FOO.ID is null
;
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
#!/usr/bin/perl use strict; use warnings; my %hash; # Daten zeilenweise aus Filehandle (hier: DATA) einlesen while (my $row = <DATA>) { # Newline entfernen chomp $row; # Zeile in Array speichern my @f = split /;/, $row; # Zeile verwerfen, wenn dieser Schlüssel schon existiert next if $hash{$f[0]}->{$f[3]}->{$f[4]}; # Zeile als ArrayRef in verschachteltem Hash speichern $hash{$f[0]}->{$f[3]}->{$f[4]} = \@f; } # Den verschachtelten Hash in einer verschachtelten Schleife auslesen for my $f0 (sort keys %hash) { for my $f3 (sort keys %{$hash{$f0}}) { for my $f4 (sort keys %{$hash{$f0}->{$f3}}) { # Das ArrayRef als Array zwischenspeichern my @f = @{$hash{$f0}->{$f3}->{$f4}}; # SQL-Statement generieren und ausgeben. my $sql = "INSERT into FOO (BAR, BAZ, BAF, BAM, BAX, BAL) values (" . join(', ', @f) . ");"; print "$sql\n"; } } } __DATA__ XXC;0.0090;0.0290;07/18/2014;03:36:35;IN XXC;0.0040;0.0240;07/18/2014;03:50:48;IN XXC;0.0020;0.0220;07/18/2014;03:50:48;IN
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
#!/usr/bin/perl use strict; use warnings; my %hash; # Daten zeilenweise aus Filehandle (hier: DATA) einlesen while (my $row = <DATA>) { # Newline entfernen chomp $row; # Zeile in Array speichern my @f = split /;/, $row; # Zeile verwerfen, wenn dieser Schlüssel schon existiert next if $hash{$f[0]}->{$f[3]}->{$f[4]}; # Schlüssel in verschachteltem Hash speichern $hash{$f[0]}->{$f[3]}->{$f[4]} = 1; # SQL-Statement generieren und ausgeben. my $sql = "INSERT into FOO (BAR, BAZ, BAF, BAM, BAX, BAL) values (" . join(', ', @f) . ");"; print "$sql\n"; } __DATA__ XXC;0.0090;0.0290;07/18/2014;03:36:35;IN XXC;0.0040;0.0240;07/18/2014;03:50:48;IN XXC;0.0020;0.0220;07/18/2014;03:50:48;IN
1
2
3
4
XXC;0.0040;0.0240;07/18/2014;03:50:48;FRIDAY_13_SQL)\x3B\x00DROP TABLE F00;
XXC;0.0040;0.0240;07/18/2014;03:50:48;FRIDAY_13_SQL)\U003B\x00DROP TABLE F00;
XXC;0.0040;0.0240;07/18/2014;03:50:48;FRIDAY_13_SQL)\U003B\0DROP TABLE F00;
XXC;0.0020;0.0220;07/18/2014;13:13:13;FRIDAY_13_SQL)\U003B\U00A\U00A\U00ADROP TABLE USERS WHERE (1=1;;
1 2 3 4
# Zeile verwerfen, wenn dieser Schlüssel schon existiert next if $hash{$f[0]}->{$f[3]}->{$f[4]}; # Schlüssel in verschachteltem Hash speichern $hash{$f[0]}->{$f[3]}->{$f[4]} = 1;
1 2
# Zeile verwerfen, wenn dieser Schlüssel schon existiert next if $hash{$f[0]}->{$f[3]}->{$f[4]}++;
2014-07-23T13:38:08 payxnach s/;++/++;/ ist das eine coole Variante, die ich nicht parat gehabt hätte, danke. In einem instruktiv gedachten Beispielscript würde ich das aber trotzdem eher nicht verwenden.
my $sql = "INSERT into FOO (BAR, BAZ, BAF, BAM, BAX, BAL) values (" . join(', ', @f) . ");";
my $sql = "INSERT into FOO (BAR, BAZ, BAF, BAM, BAX, BAL) values (" . join(', ', @f) . ");";
1 2 3
my $sql = "INSERT into FOO (BAR, BAZ, BAF, BAM, BAX, BAL) values ("; # weise $sql die Zeichenkette zu $sql .= join(', ', @f); # nimm @f als liste, verbinde diese Listeninhalte mit der Zeichenkette ', ', und hänge sie an $sql an $sql .= ");"; # hänge Zeichenkette ');' an $sql an
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Datei zum Lesen (<) öffnen open my $inFH, "<", "quelldatei.txt"; # Andere Datei (die es vielleicht noch nicht gibt) zum Schreiben (>) öffnen open my $outFH, ">", "zieldatei.txt"; # Die erste Zeile der Quelldatei auslesen (später natürlich nicht nur die erste) my $firstrow = <$inFH>; # Diese Zeile in die Zieldatei schreiben. print $outFH $firstrow; # Beide Filehandles wieder schließen close $inFH; close $outFH;
2014-07-23T11:27:22 tejsteVerschachtelter Hash? Wie kann ich mir das vorstellen? Hört sich auf jeden Fall interessant an :-)
my $primary_key = join("\t", @fields[0,3,4])