Schrift
[thread]12279[/thread]

korrektes Auslesen von Daten aus einem File



<< >> 2 Einträge, 1 Seite
ajcountry
 2008-07-31 16:43
#112944 #112944
User since
2008-07-22
4 Artikel
BenutzerIn
[default_avatar]
Hi,

bin ein kleiner noob im Bereich Perl, da ich grad damit anfange und habe ein Problem mit dem korrekten Auslesen von Daten aus einem File.

Der Aufbau des Files sieht wie folgt aus:

.
.
.
[Wertetabelle1]
|
[Zeile]
A1 3.227
A2 1.127
A3 -1.471
[Zeile]
B1 6.684
B2 1.054
B3 6.967
B4 4.008
[Zeile]
C1 2.757
C2 -3.192
C3 -2.820
[Zeile]
D1 4.245
D2 3.973
|
[Wertetabelle2]
|
[Zeile]
A1 3.227
A2 1.127
A3 -1.471
[Zeile]
B1 6.684
B2 1.054
B3 6.967
B4 4.008
[Zeile]
C1 2.757
C2 -3.192
C3 -2.820
[Zeile]
D1 4.245
D2 3.973
|
.
.
.


Mein Quelltext zum Auslesen des Files:

Code (perl): (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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/perl

use strict;

   my $line;
   my @words;
   my @liste;
   my $i;

   _schreibeWerte();

sub _schreibeWerte
{
   open(FILE, "<bla.txt")
   or die "cannot open bla.txt";

 while($line=<FILE>)
 {
     if($line =~ /\[Wertetabelle1\]/ ){ $line=_Wertetabelle();}
     if($line =~ /\[Wertetabelle2\]/ ){ $line=_Wertetabelle();}
  }
  close(FILE);
}

sub _Wertetabelle
{
   while($line=<FILE>)
   {
     if($line =~ /\[Zeile\]/)
     {
       for($i=0;$i<=50;$i++)
       {
         $line=<FILE>;
         ## Einlesen der Werte in den Array
         @words = split /\s+/,$line;
         push(@liste, $words[1]);
         
         if($line =~ /\[Zeile\]/ ) {last;} 
   print $line;
      }
       if($line =~ /\[Wertetabelle1\]/ ) {  last;}
       if($line =~ /\[Wertetabelle2\]/ ) {  last;}
     }
   }
     return $line;
}


In dem Unterprogramm sub _schreibeWerte() lese ich das File aus und suche nach den Wörtern [Wertetabelle1] bzw. [Wertetabelle2]. Wenn er eines der beiden gefunden hat, soll er in das Unterprogramm sub _Wertetabelle springen.
Das funktioniert soweit.

In dem Unterprogramm sub _Wertetabelle möchte ich dann die darauffolgende [Zeile] suchen. Nach einer [Zeile] kommt definitiv ein oder mehrere Werte. Um mehrere Werte einlesen zu können benötige ich eine Schleife. Deswegen die for-Schleife. In der for-Schleife soll der nächste Wert eingelesen werden (da wo die Zahl drin steht) und von dem Index (A1, A2, usw. abgetrennt werden. Danach speichere ich diese in ein Array (@liste). Da mehrere Werte eingelesen werden müssen, nutze ich als Abbruchkriterium [Zeile]. Sobald alle Zeilen der Wertetabelle1 eingelesen wurden, breche ich mit [Wertetabelle1] ab.

Das Problem was ich habe das sobald er die Abbruchbedingung [Zeile] gefunden hat die nächsten Werte überspringt (B1,B2,B3,B4 bzw. D1,D2) und erst wieder die nächsten Werte ausgibt. Ebenfalls gibt er mir auch die Werte von Wertetabelle2 aus, was sicher daran liegt, dass die Abbruchbedingung nicht funktioniert.
Wie kann ich erreichen, dass er mir alle Werte für die jeweilige Wertetabelle ausgibt?

Vielen Dank schon mal für die Hilfe.

Gruß, André
Dubu
 2008-08-01 02:35
#112967 #112967
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Ich verstehe zwar nicht genau, worauf der Code hinaus will (da wird $line immer wieder überschrieben, aber dafür @list immer weiter gefüllt, unabhängig davon, welche "Wertetabelle" gerade gelesen wird...), aber das Problem liegt darin, dass du nicht mehr in der äußeren Schleife auf ein neues Auftreten von "[Zeile]" oder "[Wertetabelle...]" testen kannst, weil die inneren Schleifen die entsprechende Zeile ja schon eingelesen haben. Mit dem nächsten while ($line = <FILE>) ... wird $line dann überschrieben. Evtl. könntest du schauen, ob du mit kleinen Änderungen "redo" statt "last" in den Schleifen verwenden kannst, um nicht schon die nächste Zeile einzulesen. Ansonsten musst du die Logik ganz umstricken.
<< >> 2 Einträge, 1 Seite



View all threads created 2008-07-31 16:43.