Thread Variable Anzahl an Array-Zeilen an Subroutine übergeben (11 answers)
Opened by norvel at 2012-08-03 16:42

norvel
 2012-08-03 16:42
#160589 #160589
User since
2012-07-26
20 Artikel
BenutzerIn
[default_avatar]
Hallo Allerseits,

nachdem mein alter Code anscheinend aussichtslos war, habe ich nun begonnen mit Subroutinen zu arbeiten, jedoch läuft ein Teil (wie gleich beschrieben) noch nicht so ganz.

File-Aufbau:
Das .csv File hat in der ersten Zeile Überschriften, alle Weiteren Zeilen sind mit Daten Gefüllt (angenommen: 124 Zeilen, 23Einträge pro Zeile).

Bsp:
CUSTOMER_ID,CUSTOMER_NAME,COUNTRY_NAME,AREA_NAME...COUNT_DATE(YYYYMMDD)
1111, Kunde1, Germany, NRW, ,...20120725
1111, Kunde1, Germany, NRW, HereAndThere,...20120726
1112, Kunde2, Germany, BW...20120726
...
...

Problem:
Ich habe für Schritt 2 noch keine anständige Lösung gefunden..

Verarbeitungsschritte:
1. Alle Zeilen der csv-Datei Zeile für Zeile in ein Array laden (-> file-unabhängig)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use warnings;
use strict;
use List::Util qw(min);

print "Script open!\n";

### Initialize Input
my $input_file_name = "test.csv";
open (my $fil ,"<",$input_file_name) or die "Can not open file $input_file_name!";

my $size_of_array_chunks = 10; ### set the number in wich chunks you want to split the array. Necessary because otherwise the generated statement in db_query would be too long
my @allrows = <$fil>; ### stores all rows of the csv file


2. Zeilen des Arrays in z.B. 10er Schritten an eine Subroutine übergeben (Ausnahme: die Datei hat keine feste länge, der Code muss auch variable längen handlen können. Anzahl Zeilen Bsp: 5, 123, 10, 6001. Also müssen manchmal weniger als 10 Zeilen im Ersten oder letzten Durchlauf übergeben werden ) Dieser (nicht funktionierender) Code kann gerne ersetzt werden..ich denke, dass dies ohnehin keine gute Lösung wäre - auch wenn sie funktionieren würde:
Code: (dl )
1
2
3
4
5
6
7
foreach my $set (0..int(@allrows-1/$size_of_array_chunks)) ### generate the chunks (Explanation: with "$size_of_array_chunks = 100" this loop will do "@allrows[0..99]", then "@allrows[100..144]" if the File has 155 Rows)
{
my $testval = (@allrows[$size_of_array_chunks*$set..min($size_of_array_chunks*($set+1)-1,$#allrows)]);
print "$testval\n";
do_sth(@allrows[$size_of_array_chunks*$set..min($size_of_array_chunks*($set+1)-1,$#allrows)]);
#if the file has 17 lines, the code still runs 15 times even though the file is already at the end
}


3. In dieser Subroutine werden die Zeilen in ein 2D-Array geschrieben, sodass ich alle Werte im Folgenden einzen verwenden kann (Code-Teil nur zur Veranschaulichung...)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub do_sth 
{
my $db_query_counter = 0; ### necessary to differenciate between the first part of the sql query and every following OR
my @missing_query_part = ();

foreach my $string (@_)
{
# print "\n";
# print "(foreach) sub input: ${string}";
chomp(${string});
${string}=~ s/\"//g; # Removes all
my @values = split(/\s*,\s*/, ${string});
push our @chunk_data_array, [@values]; ## [] referenz
### (.....)

}

4. Mit 2 Werten dieses Arrays wird ein SQL-Query String aufgebaut
5. Dieser Query string wird in einen anderen SQL-Code eingefügt und an die Datenbank gesendet (Ziel des Querys: die zuvor eingelesenen Daten durch den SQL-Query mit weiteren Daten ergänzen)
6. Den entsprechenden Rückgabewert dem entsprechenden Eintrag zuweisen (durch if-Abfragen die jeden Eintrag des Arrays)
7. Daten in ein CSV-File Schreiben

8. Die nächsten 100 Zeilen einlesen
ACHTUNG: Sind nicht immer genau 10 Zeilen, können auch mal wie im Bsp. nur 4 Zeilen im letzten Durchlauf sein)



Wie immer vielen Dank für eine Hilfe! :)

View full thread Variable Anzahl an Array-Zeilen an Subroutine übergeben