Wenn du "use warnings" drin hast, solltest du das "-w" weglassen. Naeheres siehe
perllexwarn.
use strict;
use warnings;
use Text::CSV_XS;
my @fields;
my $geparst;
my @geparst;
my $i;
Diese Variablen brauchst du entweder gar nicht oder zumindest nicht hier. Variablen immer im kleinstmoeglichen Bereich deklarieren (Schleifenvariablen z.B. nur in der Schleife).
my $file = 'apo_neu-1.csv';
my @entries;
my $parser = Text::CSV_XS->new({sep_char => ';',
'binary' => 1
});
open(DATEI,">datei.txt") or die $!;
open(my $fh,"<$file") or die "File apo_neu-1.csv nicht gefunden";
Nicht gefunden ist
eine Moeglichkeit. Der wahre Grund steht aber in
$!, deshalb sollte man sich den Inhalt dieser Variable bei Fehlern mit ausgeben lassen:
open (...) or die "Fehler beim Oeffnen: $!";
while (my $line = <$fh>)
{
if($parser->parse($line))
Zu diesem
if (...) fehlt eine
else-Zweig: Was soll passieren, wenn eine Zeile
nicht geparst werden kann? Vgl. pqs Kommentar oben.
{
@fields = $parser->fields();
if ($fields[-1] =~ m/^\d{2}$/ and $fields[-1] > 0 and $fields[-1] <= 49) # Nur Zahlen von 01 bis 49
{ ;
my $geparst = join (' ',@fields);
@geparst = $geparst;
print DATEI $_,"\n" for(@geparst);
Warum so umstaendlich?
Du fasst alle Felder aus
@fields zum Skalar
$geparst zusammen, weist diesen dann dem Array
@geparst zu (das somit nur ein Element enthaelt) und gibst dieses Array dann in
DATEI aus - mit einer Schleife ueber genau ein Element.
Das ginge kuerzer mit:
print DATEI join (' ', @fields), "\n";
}
}
}
close $fh;
close (DATEI);
open(DATEI,"datei.txt") || die "File datei.txt nicht gefunden";
@geparst = <DATEI>;
close(DATEI);
Aeh ... was soll das denn?
Du schreibst erst die unsortierten Daten in "datei.txt", um sie dann gleich wieder aus der Datei auszulesen, im Anschluss zu sortieren und dann nochmal in "datei.txt" zu schreiben?? Und brauchst du diese Datei danach ueberhaupt nochmal?
Warum speicherst du nicht gleich in der Schleife oben in das Array
@geparst, statt in die Datei?
push @geparst, join (' ',@fields);
my @sorted = map{$_->[0]}sort{$a->[1]->[-1] <=> $b->[1]->[-1]}map{[$_,[split(/ /,$_)]]}@geparst; # Sortieren nach dem letzten Arrayfeld
my $anzahl = @sorted;
open(DATEI,">datei.txt") || die $!;
print DATEI $_ for(@sorted);
close(DATEI);
Okay, wofuer auch immer du die Datei brauchst ...
#-----------------------------------------------------------------------------------------
# Aufteilen der Daten auf 6 Server
#-----------------------------------------------------------------------------------------
open(SERVER1,">apo_server1.txt") || die "Datei apo_server1.txt nicht gefunden";
for($i=0; $i<$anzahl;)
{
print SERVER1 $sorted[$i];
$i += 6;
}
close(SERVER1);
[...etc...]
Uh, das ist wirklich boese. Sechsmal fast identischer Code. Den koennte man wirklich gut zusammenfassen:
# Aufteilen auf $servercnt Server
my $servercnt = 6;
my @servers;
for my $s (0 .. $servercnt-1) {
open ($servers[$s], '>', "apo_server" . $s+1 . ".txt")
or die "Konnte Datei apo_server" . $s+1 . ".txt nicht zum Schreiben oeffnen: $!";
}
my $act_server = 0;
for my $i (0 .. $anzahl) {
print $servers[$act_server] $sorted[$i]; # Zeile fuer Server Nr. $act_server+1 ausgeben
$act_server = ($act_server+1 % $servercnt); # naechster Server
}
close $_ for @servers;
(ungetestet)
Edit: ungetestet und falshc. Das mit dem indirekten Filehandle hinter print klappt so nicht (wie ich schon befuerchtete) und beim Modulo fehlen Klammern. Siehe den verbesserten Code in meinem naechsten Beitrag.\n\n
<!--EDIT|Dubu|1131640430-->