Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8034[/thread]

Problem mit veschachtelten while-Schleifen

Leser: 1


<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
EagleFox
 2006-05-30 20:42
#66772 #66772
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Hallo Leute,

ich möchte folgendes realisieren:

ich habe zwei Dateien X und Y, die viele große Datensätze enthalten.
Nun soll aus X der erste Datensatz in Array1 gelesen werden, und aus Y der erste Datensatz in Array2. Diese sollen dann mit einem subProgramm miteinander verbearbeitet werden. Dann soll aus X und Y jeweils der zweite Datensatz in Array1 bzw. Array2 gelesen und wieder mit dem subProgramm bearbeitet werden. usw.

Ich habe schon angefangen das Auslesen in Array1 mit einer while-schleife zu realisieren, die dann in eine while-schleife für array2 übergeht, was totaler quatsch ist, weil dann erst die zweite while-schleife durchgehöddelt wird, bevor die erste wieder an der Reihe ist. Funktioniert also nicht so.

Ich habe im Moment keine Idee, wie ich das realisieren kann. Ich hoffe Euch fällt dazu was passendes ein!

DANKE!
GwenDragon
 2006-05-30 20:51
#66773 #66773
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Wie wäre es damit?
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
my (@array1, @array2);
open( F1, "datei1") or die $!;
open( F2, "datei2") or die $!;
while ( 1 )
{
$daten1 = <F1>;
last if not defined $daten1;
push( @daten1, $daten1 );

$daten2 = <F2>;
push( @daten2, $daten2 );
}
close (F1) or die $!;
close(F2) or die $!;

subprogramm( \@daten1, \@daten2 );


Lies doch erst einmal alles ein und verabeite dann die Arrays.\n\n

<!--EDIT|GwenDragon|1149008264-->
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

EagleFox
 2006-05-30 21:09
#66774 #66774
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Vielen Dank schon mal für die Antwort!

Das Problem ist, dass meine "kleineren" Dateien jeweils 2!GB groß sind. Die Datensätze in den Dateien sind durch jeweils zwei Leerzeilen getrennt. Somit kann ich jeweils nur einen Satz einlesen bis zu den Leerzeilen, die beiden Datensätze bearbeiten und dann die nächsten nehmen!
Ronnie
 2006-05-30 21:11
#66775 #66775
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Wenn du bei GwenDragons Vorschlag Bedenken wegen der Speicher-Belastung hast (bei sehr großen Dateien), kannst du problemlos CPAN:Tie::File verwenden - ansonsten bleibt es gleich der von GwenDragon vorgeschlagenen Variante.
Thorium
 2006-05-30 21:22
#66776 #66776
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
So wie ich das aus der Beschreibung oben sehe gibt es keinen Grund, weiso man die Daten alle zuerst alle einlesen müsste:

Code: (dl )
1
2
3
4
5
6
open FILE1, $file1 or die $!;
open FILE2, $file2 or die $!;

while (defined(my $line1 = <FILE1>) and defined(my $line2 = <FILE2>)) {
doAnything($line1, $line2);
}

Edit: sorry für doppelpost\n\n

<!--EDIT|Thorium|1149009816-->
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
GwenDragon
 2006-05-30 21:23
#66777 #66777
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
Kannst du mal posten wie die Datensätze aufgebaut sind?
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

GwenDragon
 2006-05-30 21:26
#66778 #66778
User since
2005-01-17
14533 Artikel
Admin1
[Homepage]
user image
[quote=Thorium,30.05.2006, 19:22]So wie ich das aus der Beschreibung oben sehe gibt es keinen Grund, weiso man die Daten alle zuerst alle einlesen müsste[/quote]
Nein, gibt es nicht.
Meins war nur eine unelegante Lösung, mehr nicht ;)
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

EagleFox
 2006-05-30 21:34
#66779 #66779
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Ich habe auch Bauchschmerzen, weil ich dann in den Arrays die Leerzeilen habe, die mir bei allen Berechnungen (und das sind ne ganze Menge) tausende von Fehlern ausschmeissen. Hätte ich keine Leerzeilen, könnte ich die Datensätze später nicht mehr auseinanderhalten, da sie auch unterschiedlich lang sind!

Die Idee von Thorium klingt da irgendwie besser!

Die Datensätze sehen so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
23.343434  0.0343   0.2344   #Beginn Datensatz 1
23.354553 0.1234 0.3443
.
ca. 20000 Zeilen
.
.
24.343434 0.3434 0.3434 #Ende Datensatz 1


23.343434 0.0343 0.2344 #Beginn Datensatz 2
23.354553 0.1234 0.3443
.
ca. 20000 Zeilen
.
.
24.343434 0.3434 0.3434 #Ende Datensatz 2


usw.
renee
 2006-05-30 21:42
#66780 #66780
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich würde die $/-Variable verwenden. Du willst ja vermutlich immer einen Datensatz komplett haben...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;

my $file_1 = '/pfad/zur/datei.txt';
my $file_2 = '/pfad/zur/datei.dat';

{
local $/ = "\n\n";
open(my $fh_1,'<',$file_1) or die $!;
open(my $fh_2,'<',$file_2) or die $!;
while(defined(my $entry = <$fh_1>) and defined(my $entry_2 = <$fh_2>)){
tu_was($entry,$entry_2);
}
close $fh_1;
close $fh_2;
}


Mehr zu $/ ist unter perlvar zu finden...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
EagleFox
 2006-05-30 21:57
#66781 #66781
User since
2006-04-10
66 Artikel
BenutzerIn
[default_avatar]
Jau, der Datensatz muss schon komplett sein!
Das werde ich gleich mal probieren!

VIELEN DANK!
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2006-05-30 20:42.