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
my $i1=0; # initzialize File row counter to remove the first line (headline)
my $i3=0; ### counterpart to the breakpoint
my $breakpoint=10; ### till wich file-row the sql statement will be read
my $sql = 1;
our @query_out = ();
while ($line_query_input=<FIL> and $i3 <= $breakpoint)
{
chomp($line_query_input);
my @values = split(/\s*,\s*/, $line_query_input);
push @data_array, [@values];
if ($i1>=1 && $sql ==1) # notwendig um sql abfrage richtig zu beginnen und die Überschriftszeile im csv-File zu überspringen
{
$query_out[$i1] = "(a.id= '$data_array[$i1][0]' and cc.code_nr = '$data_array[$i1][20]')";
$sql = 0;
}
elsif ($i1>1)
{
$query_out[$i1] = " OR (a.id = '$data_array[$i1][0]' and cc.code_nr = '$data_array[$i1][20]')";
}
$i1++; ### line-counter
$i3++; ### zählt bis $breakpoint, nach der weiterverarbeitung wird er wieder auf 0 gesetzt -> sdie nächsten 10 zeilen werden eingelesen
if ($i3>= $breakpoint or $line_query_input== <FIL>) #### Fehlerquelle: or $line_query_input== <FIL>
{
# ....Weiterverarbeitung.....
$i3 = 0; ### Die nächsten Zeilen können eingelesen werden...solange bis $breakpoint erreicht ist
$sql = 1;
@query_out = (); ### array leeren
}
1
2
3
4
while (@data_array) {
@teileintraege = splice @data_arraz, 0, 10;
verarbeiteTeileintraege(@teileintraege);
}
1 2 3 4 5 6 7 8 9
sub naechstes_paeckchen { my $breakpoint = 10; for (1..$breakpoint) { my $line = <CSV>; break unless defined $line; ... } }
1 2 3 4 5 6
do { my @daten = naechstes_paeckchen(); .... } while (@daten); # nu iss die Datei wohl aus
1
2
3
4
5
6
7
8
9
10
11
12
13
if ($i1>=1 && $sql ==1)
{
$query_out[$i1] = "(a.asset_id = '$data_array[$i1][0]' and cc.serial_nr = '$data_array[$i1][20]')";
print "$query_out[$i1][0]";
print "$query_out[$i1][20]";
$sql = 0;
}
elsif ($i1>1)
{
$query_out[$i1] = " OR (a.asset_id = '$data_array[$i1][0]' and cc.serial_nr = '$data_array[$i1][20]')";
print "$query_out[$i1][0]";
print "$query_out[$i1][20]";
}
my $db_query= "select (...) from (...) where (...)and (@query_out) group by (...)";
# ....Weiterverarbeitung.....
if ($i3>= $breakpoint)
{ asset_id => ..., serial_nr => ... }
1 2 3 4 5
my @data = naechstes_paeckchen(); if (@data) { my $query_out = join(' OR ', map { "a.asset_id = $_->{asset_id} and cc.serial_nr = $_->{serial_nr}" } @data); ... }
1 2 3 4
for my $line (@data) { push @where, 'a.asset_id = ? and cc.serial_nr = ?'; push @params, $line->{asset_id}, $line->{serial_nr}; }
2012-08-01T09:34:16 norvelDie SQL-Injection-Lücke sollte kein Problem sein, da die Anfragen vom Firmennetz auf einen Server im Firmennetz gehen, oder?!
QuoteEDIT: Neue Fragen (alternative Lösungsansätze?):
- Hat while ($line_query_input=<FIL>) vielleicht einen Return-Wert, den man abfragen könnte?
Quote- Wäre es möglich NUR die letzte Zeile des Files (ohne CPAN) auszulesen (Performancegründe, die .csv hat ca 6000 Zeilen)? Dann könnte ich Prüfen ob genau der Datensatz "erreicht" ist und das in mein if ($i3>= $breakpoint) Statement mit aufnehmen
QuoteWas für einen für dich sinnvollen Return-Wert soll "while" denn haben? Ich verstehe nicht, was du hier tun willst.
Quote6000 Zeilen sind nicht viel. Hast du wirklich Performanceprobleme? Und sicher identifiziert, woran das liegt?
1
2
3
4
5
6
7
8
9
10
### 1. Schritt: Letzte Zeile des Files finden
while ($line_query_input=<FIL>)
{
chomp($line_query_input);
my @values = split(/\s*,\s*/, $line_query_input);
push @data_array, [@values];
}
### 2. Schritt: Irgendwie das letzte Element auslesen, in temp-Array speichern um später die Werte im if-Statement zu vergleichen?
### 3. Schritt: Den in der Frage geposteten Code
2012-08-01T08:43:30 norvelDamit meine ich ob ich durch das "$line_query_input=<FIL>" in dem while-Konstrukt (($line_query_input=<FIL> and $i3 <= $breakpoint)) irgendeinen Wert zurück bekomme der mir anzeigt, dass ich nun am Ende des Files bin.
QuoteAlso:
Code: (dl )### 1. Schritt: Letzte Zeile des Files finden
Quote### 2. Schritt: Irgendwie das letzte Element auslesen, in temp-Array speichern um später die Werte im if-Statement zu vergleichen?
2012-08-01T09:13:13 norvelIch habe auf Muffi's Anfrage hin nocheinmal eine neue Beschreibung hinzugefügt, leider scheinst du aber inzwischen davon überzeugt zu sein, dass ich nur müll schreibe und liest somit auch nur müll aus - meiner Meinung nach - verständlichen Beschreibungen heraus.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
open my $datei, '<', "dateiname" or die ...
scalar <$datei>; # remove first line
while (my @zeilen = teil_aus_datei($datei, 10)) {
#hier hat @zeilen dann maximal 10 Zeilen (oder weniger am Dateiende)
#verarbeite die @zeilen
}
#mit folgender sub:
sub teil_aus_datei {
my ($fh, $max) = @_;
my @result;
while (<$fh>) {
push @result, $_;
last if @result == $max;
}
return @result;
}