Thread Zeile im FH wird durch eine Unterabfrage (~"if eof") der while-Schleife übersprungen (22 answers)
Opened by norvel at 2012-07-31 16:42

norvel
 2012-07-31 16:42
#160326 #160326
User since
2012-07-26
20 Artikel
BenutzerIn
[default_avatar]
Hallo allerseits,

ich habe folgende Situation:
ich lese ein csv-File Zeile für Zeile aus, allerdings immer nur in z.B. 10er-Schritten ($breakpoint), da ich über den Weg eine SQL-Datenbankabfrage mit den richtigen Abfragekriterien fülle (später werden anstatt 10 Abfragekriterien z.B. 1000 eingelesen).
Dies funktioniert so lange bis mein .csv-File eine gerade Anzahl an Reihen hat, falls jedoch z.B. 23 Zeilen vorhanden sind, werden die letzten 3 Zeilen nicht mehr weiterverarbeitet, da "if($i3>= $breakpoint)" natürlich nicht erfüllt ist.
Diesen Fall wollte ich abfangen, indem ich prüfe ob der pointer meines FH (FIL) auf der letzten Position ist - also die letzte Zeile erreicht ist...
Der bisher erfolgreichste Versuch mit "if ($i3>= $breakpoint or $line_query_input== <FIL>)" ist gescheitert, da dadurch immer eine Zeile im File "übersprungen" wird. (Ich schätze, da durch <FIL> im if-Statement schon die nächste Zeile eingelesen wird und beim <FIL> in der While-Schleife dann nocheinmal.)

Meine Frage ist nun wie ich das Problem Lösen könnte... :)

EDIT: Neue Fragen (alternative Lösungsansätze?):
- Hat while ($line_query_input=<FIL>) vielleicht einen Return-Wert, den man abfragen könnte?
- 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


Vielen Dank im Vorraus für eure Bemühungen!

PS: Bitte wirklich nur auf die Problemstellung beschränken, ob mein Weg das SQL Query zu erstellen der optimalste ist sei erstmal dahin gestellt :D


Code: (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
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
}

Last edited: 2012-08-01 09:11:31 +0200 (CEST)

View full thread Zeile im FH wird durch eine Unterabfrage (~"if eof") der while-Schleife übersprungen