Schrift
[thread]13126[/thread]

daten auslesen benötige hilfe

Leser: 1


<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten
quant
 2009-02-10 16:37
#118775 #118775
User since
2009-02-10
2 Artikel
BenutzerIn
[default_avatar]
hi

also ich habe große datenfiles in denen events gespeichert werden. diese lese ich normalerweise mit perl ein und bearbeite sie dann. normalerweise mach ich auch nur eine abfrage pro event. jetzt ist es so dass ich überprüfen will ob eine zahl 2 mal im gleichen event vorkommt und wenn ja will ich die werte auslesen. ldr weiss ich irgendwie garnicht wie ich das hinbekommen soll... ich poste hier mal wie ich es sonst immer gemacht habe:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/perl

while(<>) {
 @stuff=split(' ');

 if(/UQMD/){
 }
 elsif(/projectile:/){
  $protar=$_
 }
 elsif(/equation_of_state:/){
  $ecm=$stuff[5];
  $midy=log($ecm/0.938);
  $elab=$stuff[3];
  $plab=$stuff[7];
 }
 elsif(/event#/){
  $noe++                    # numbers of events: noe
 }
 else{
  if($#stuff==14){

   @x=@stuff[0..3];
   @p=@stuff[4..7];
   @id=@stuff[8..11];

   $mass=$id[0];
   $ityp=$id[1];
   $iz2=$id[2];
   $charge=$id[3];

   if ($ityp==27) {
   $noe1=$noe;
    print("lambda \n");
    print("Event", $noe1, "\n");
}

  if ($itype==27 && $noe1==$noe){
    print("match");

#
#   if ($ityp== 27) {
#   $noe2=$noe;
#    print("Event", $noe2, "\n");

#     $neo2=$neo;
#       if ($neo1== &neo2){
#     print("lambda \n");
#     print("Event",$neo2, "\n");

#    $pt=sqrt($p[1]*$p[1]+$p[2]*$p[2]);
#    $ipt=int($pt/$dpt);
#    $npim[$ipt]++;
# print("2 lambdas \n");

#
#hier würde ich jetzt gerne überprüfen ob die 27 zwei mal im gleichen event auftaucht
#

}
}
 }
  }
quant
 2009-02-10 16:38
#118776 #118776
User since
2009-02-10
2 Artikel
BenutzerIn
[default_avatar]
meine event files sehen so aus: das ist nur ein kleiner auszug normal sind dort bis zu 1mio events drinne

[code]
output_file 14
projectile: (ityp, char) -1 -1 target: (mass, char) 108 54
transformation betas (NN,lab,pro) 0.0000000 0.8831982 -0.8831982
impact_parameter_real/min/max(fm): 0.00 0.00 0.00 total_cross_section(mbarn): 0.00
equation_of_state: 0 E_lab(GeV/u): 0.6653E+01 sqrt(s)(GeV): 0.4000E+01 p_lab(GeV/u): 0.7533E+01
event# 1 random seed: 1210762361 (auto) total_time(fm/c): 200 Delta(t)_O(fm/c): 200.000
op 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
op 0 0 0 0 0 0 1 0 1 0 0 0 0 2 1
op 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0
pa 0.1000E+01 0.5200E+00 0.2000E+01 0.3000E+00 0.0000E+00 0.3700E+00 0.0000E+00 0.9300E-01 0.3500E+00 0.2500E+00 0.0000E+00 0.5000E+00
pa 0.2700E+00 0.4900E+00 0.2700E+00 0.1000E+01 0.1600E+01 0.8500E+00 0.1550E+01 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
pa 0.9000E+00 0.5000E+02 0.1000E+01 0.1000E+01 0.1000E+01 0.1500E+01 0.1600E+01 0.0000E+00 0.2500E+01 0.1000E+00 0.3000E+01 0.2750E+00
pa 0.4200E+00 0.1080E+01 0.8000E+00 0.5000E+00 0.0000E+00 0.5500E+00 0.5000E+01 0.8000E+00 0.5000E+00 0.8000E+06 0.1000E+01 0.2000E+01
pvec: r0 rx ry rz p0 px py pz m ityp 2i3 chg lcl# ncl or
111 200
111 68 39 4 22 37 0 0
0.20000000E+03 0.62122916E+00 -0.89752594E+01 -0.15401116E+03 0.15217191E+01 -0.74299983E-02 -0.58668583E-01 -0.11967823E+01 0.93800002E+00 1 1 1 29 7 0
0.20000000E+03 -0.75441914E+00 -0.43547948E+01 -0.17453144E+03 0.16520035E+01 -0.10981613E+00 0.25873991E-01 -0.13801362E+01 0.90089434E+00 1 1 1 0 0 0
pq
 2009-02-10 17:49
#118777 #118777
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
bitte nicht doppelt posten. wenn ein gast-posting nicht sofort erscheint, liegt das daran, dass
es erst von uns freigegeben werden muss, wie auch in der bestätigung zu lesen ist.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
renee
 2009-02-10 18:24
#118778 #118778
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bei "event" gibt es mehrere Zahlen. Welche willst Du beachten?

Generell ist es hilfreich, wenn Du neben den Eingabedaten das beschreibst, was am Ende rauskommen soll.
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/
Gast Gast
 2009-02-10 18:36
#118779 #118779
also prinzipiell sieht es folgendermaßen aus... ich hab ein großes file wo immer ein eventkopf ist dann dann solche zeilen folgen wie die letzten beiden

0.20000000E+03 0.62122916E+00 -0.89752594E+01 -0.15401116E+03 0.15217191E+01 -0.74299983E-02 -0.58668583E-01 -0.11967823E+01 0.93800002E+00 1 1 1 29 7 0
0.20000000E+03 -0.75441914E+00 -0.43547948E+01 -0.17453144E+03 0.16520035E+01 -0.10981613E+00 0.25873991E-01 -0.13801362E+01 0.90089434E+00 1 1 1 0 0 0

mit meinem gepostet perl script kann ich diese zeilen schon einlesen und verarbeiten. normal sind es 30-50 verschiedene zahlenfolgen vom oberen typ. jetzt ist es so dass ich dort nach der zahl 27 suche zb.

0.20000000E+03 -0.75441914E+00 -0.43547948E+01 -0.17453144E+03 0.16520035E+01 -0.10981613E+00 0.25873991E-01 -0.13801362E+01 0.90089434E+00 27 1 1 0 0 0

dann will ich im gleichen event, die event nummer wird oben im event kopf zugewiesen suchen will ob es noch eine zeile mit 27 gibt und wenn ja, dann will ich einen counter auf +1 setzen oder sowas...

es gibt events wo die keinmal, einmal oder zweimal auftaucht und mich intrssiert erst mal nue die welche wo sie einmal auftauchen
styx-cc
 2009-02-11 04:13
#118781 #118781
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hi.
Das Problem an sich sieht recht interessant aus, aber deine Quelltext weigere ich mich zu entziffern, benutze doch bitte strict (use strict) und warnings (use warnings) und lese dir das bitte unbedingt durch: http://wiki.perl-community.de/bin/view/Wissensbasi...

Du müsstest genau sagen, was deine Eingabedaten sind, was dabei herauskommen soll, und das ganze am besten an einem minimalistischem Codestueck (trotzdem strict und warnings benutzen) demonstrieren. Und zusätzlich wäre es noch nett, wenn du deine Beiträge lesbarer formatierst, z.B. Ein- und Ausgabedaten in Codeblöcke ([nop]
Code: (dl )
Deine Daten
[/nop])

Wenn du das machst, werde ich mir auch die Zeit nehmen und versuchen dein Problem zu lösen - ich kann mir auch gut vorstellen, dass es anderen ähnlich geht.

Mit freundlichen Grüßen
Pörl.
Gast Gast
 2009-02-11 11:04
#118783 #118783
Nachdem isch eine halbe Stunde über deinem Code gebrütet habe, (Deklariere Variablen als lokale Variablen, wenn es welche sein sollen, das mach riesige Probleme beim lesen heraus zu finden, welchen Variablen Lokal sein sollen und weche nicht, vor allem wenn Fehler im Code sind.) glaube ich zu erkennen was du im auskommentierten Block versuchst. Das dein Versuch eines Zählers der Events. Aber das kann so nicht funktionieren.
Wo ermittelst du den namen des Events? Ich meine einen eindeutigen Namen. Ich finde in deinem Code ein Zähler "$noe" (ausgeschrieben hätte man sofort weiß was gemeint ist "nr_of_events" ist doch auch nicht so viel mehr zu schreiben) und der ist als eindeutiger Name nicht zu gebrauchen, da er immer hochzählt. Oder ist "$ityp" der eventname? ("27"??) Befindet er sich tatsächlich an der 10ten stelle in "@stuff" (Index 9)? (hast du keinen besseren Namen gefunden? zB. "@splitted_line")

Allso ich würde erstens "strict" und "warnings" nutzen. Ich konnte auf Anhieb mehrer "Schreibfehler" im Code finden (die perl versucht zu Interpretieren), und jede Menge fehlenende Variablendeklarationen. (was ist lokal, was soll global sein??)

Und wenn du die das Auftreten eines Eventtypes zählen willst pack den Eventnamen in einen Hash und zähle sein auftreten hoch. Ungefähr so:

Code (perl): (dl )
1
2
3
4
5
6
7
my %event;
#...
$event{$eventname}++;
#...
if($event{$eventname}>=2){
# mach was
}


Ganz nebenbei. So kann man Scripte schreiben, aber man sollte es nur machen wenn man wirklich sicher in Perl ist, viel Erfahrung hat, genau weiß was man will (die Programmlogik vollständig im Kopf hat) und den Code danch wegschmeißt.
Wenn man sich an ein Problem herantastet, dann kommt man mit unaussagekräftigen Variablen, felende Einschränkugen deren Güligkeit, schlecht eingerückten Code und ohne erklährende Kommentare, in Teufelsküche.
Vor allem wenn man den Code anderen zeigen will, oder nach ein paar Wochen etwas ändern möchte, sollte man sich etwas Mühe geben.
quant82
 2009-02-11 11:15
#118785 #118785
User since
2007-07-27
13 Artikel
BenutzerIn
[default_avatar]
hallo
danke dass du dich mir annimmst, ich hab versucht mal das umzusetzen was du geschrieben hast... der code läuft auch soweit, solange ich pro event nur nach einem lambda (27) suche, sobald ich nach 2 suchen will versagt mein können.
hier der modofizierte code:
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/perl
use strict;
use warnings;

my $noe;
while(<>) { 
my @stuff=split(' ');

 if(/UQMD/){
 }
 elsif(/projectile:/){
 my $protar=$_
 }
 elsif(/equation_of_state:/){
  my $ecm=$stuff[5];
  my $midy=log($ecm/0.938);
  my $elab=$stuff[3];
  my $plab=$stuff[7];
 }
 elsif(/event#/){
  $noe++                    # numbers of events: noe
 }      
 else{
  if($#stuff==14){ 

   my @x=@stuff[0..3];   
   my @p=@stuff[4..7];
   my @id=@stuff[8..11];

   my $mass=$id[0];
   my $ityp=$id[1];
   my $iz2=$id[2];
   my $charge=$id[3];

# ab hier steht folgende info zur verfuegung:

# stuff[0] = r_0    = $x[0]
# stuff[1] = r_x    = $x[1]
# stuff[2] = r_y    .
# stuff[3] = r_z    .
# stuff[4] = p_0    = $p[0]
# stuff[5] = p_x    = $p[1]
# stuff[6] = p_y    .
# stuff[7] = p_z    .
# stuff[8] = mass   = $id[0]
# stuff[9] = ityp   = $id[1]
# stuff[10]= iz2    = $id[2]
# stuff[11]= charge = $id[3]
my $noe1;

   if ($ityp==27) {
    $noe1=$noe;
    print("lambda \n");
    print("Event", $noe1, "\n");
   
#   if ($itype==27 && $noe1==$noe){ #hier wuerde ich gern suchen ob 27 nochmal vorkommt in diesem event
#     print("match");

#   }
   }
} 
 }
  }
 


die daten files die ich checke sehen immer gleich aus, oben ist eine art kopf wo event nummer etc. drinne stehen und dann folgt eine tabelle mit werten... in dieser tabelle will ich dann erst mal pro event suchen ob die zahl 27 zwei mal vorkommt

hier der input:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
UQMD   version:       20030   1000  20030  output_file  14
projectile: (ityp, char) 49 -1 target: (mass, char) 197 79
transformation betas (NN,lab,pro) 0.0000000 0.1110044 -0.0794210
impact_parameter_real/min/max(fm): 0.00 0.00 0.00 total_cross_section(mbarn): 0.00
equation_of_state: 0 E_lab(GeV/u): 0.2407E-01 sqrt(s)(GeV): 0.2263E+01 p_lab(GeV/u): 0.2528E+00
event# 1 random seed: 1234262625 (fixed) total_time(fm/c): 200 Delta(t)_O(fm/c): 200.000
op 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
op 0 0 0 0 0 0 1 0 1 0 0 0 0 2 1
op 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0
pa 0.1000E+01 0.5200E+00 0.2000E+01 0.3000E+00 0.0000E+00 0.3700E+00 0.0000E+00 0.9300E-01 0.3500E+00 0.2500E+00 0.0000E+00 0.5000E+00
pa 0.2700E+00 0.4900E+00 0.2700E+00 0.1000E+01 0.1600E+01 0.8500E+00 0.1550E+01 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00 0.0000E+00
pa 0.9000E+00 0.5000E+02 0.1000E+01 0.1000E+01 0.1000E+01 0.1500E+01 0.1600E+01 0.0000E+00 0.2500E+01 0.1000E+00 0.3000E+01 0.2750E+00
pa 0.4200E+00 0.1080E+01 0.8000E+00 0.5000E+00 0.0000E+00 0.5500E+00 0.5000E+01 0.8000E+00 0.5000E+00 0.8000E+06 0.1000E+01 0.2000E+01
pvec: r0 rx ry rz p0 px py pz m ityp 2i3 chg lcl# ncl or
198 200
1 1 0 0 0 0 0 0
0.20000000E+03 -0.29270856E+01 -0.21151216E+01 -0.10648322E+02 0.95357633E+00 -0.29205595E-01 -0.38037133E-01 -0.28511840E+00 0.90868890E+00 1 1 1 0 0 0
0.20000000E+03 -0.26733028E+01 -0.48575282E+01 -0.11135421E+02 0.93966054E+00 -0.16105977E+00 -0.78331655E-01 -0.14366491E+00 0.91117848E+00 1 1 1 0 0 0
0.20000000E+03 0.17302826E+01 -0.19563007E+01 -0.59252391E+01 0.93977688E+00 -0.16357943E+00 -0.15714093E+00 -0.14424081E+00 0.90051300E+00 1 1 1 0 0 0
0.20000000E+03 0.53763010E+01 0.40176612E+01 -0.96760700E+01 0.93947602E+00 0.89151978E-01 0.10288793E+00 -0.14219121E+00 0.91862008E+00 1 1 1 0 0 0
0.20000000E+03 0.13783666E+01 -0.58041928E+00 -0.95032043E+01 0.93026380E+00 -0.17300076E+00 0.10975707E+00 -0.48033855E-01 0.90614989E+00 1 1 1 0 0 0


danke für eure hilfe
Gast Gast
 2009-02-11 11:39
#118786 #118786
Schön, dass du einige Kommentare geschriben hast und "strict" sowie warnings genutzt hast, auch die Einrückung ist jetzt besser. Danke.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/perl
use strict;
use warnings;

# Ein Hash mit den Eventnamen als Schlüssel.
# die Werte sind Zähler,
# welche die Häfigkeit des Auftreten der Events zählen.
my %events;

# Geammtanzahl der Events
my $noe;

while(<>) { 
my @stuff=split(' ');

 if(/UQMD/){
 }
 elsif(/projectile:/){
 my $protar=$_
 }
 elsif(/equation_of_state:/){
  my $ecm=$stuff[5];
  my $midy=log($ecm/0.938);
  my $elab=$stuff[3];
  my $plab=$stuff[7];
 }
 elsif(/event#/){
  $noe++                    # numbers of events: noe
 }      
 else{
  if($#stuff==14){ 

   my @x=@stuff[0..3];   
   my @p=@stuff[4..7];
   my @id=@stuff[8..11];

   my $mass=$id[0];
   my $ityp=$id[1];
   my $iz2=$id[2];
   my $charge=$id[3];

# ab hier steht folgende info zur verfuegung:

# stuff[0] = r_0    = $x[0]
# stuff[1] = r_x    = $x[1]
# stuff[2] = r_y    .
# stuff[3] = r_z    .
# stuff[4] = p_0    = $p[0]
# stuff[5] = p_x    = $p[1]
# stuff[6] = p_y    .
# stuff[7] = p_z    .
# stuff[8] = mass   = $id[0]
# stuff[9] = ityp   = $id[1]
# stuff[10]= iz2    = $id[2]
# stuff[11]= charge = $id[3]

   # Events eines bestimmten Typs zählen
   $event{$itype}++;

   if ($ityp==27) {
    print("lambda \n");
    print("Event", $noe, "\n");
    # Wenn der event des Typs "27" mindestens zwei mal aufgetaucht ist...
    if ($event{27} >= 2){
      print("match");
     # es könnte sinnvoll sein den zähler wieder zurück zu setzen,
     # oder die bedingung auf ==2 zu setzen.
     # Aber ich weiss nicht genug über die Logick um dir da zu helfen
    }
   }
  } 
 }
}
Gast Gast
 2009-02-11 11:45
#118787 #118787
Alternativ
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/perl
use strict;
use warnings;

#event 27 zählen
my count_event_27=0;

# Geammtanzahl der Events
my $noe;

while(<>) { 
my @stuff=split(' ');

 if(/UQMD/){
 }
 elsif(/projectile:/){
 my $protar=$_
 }
 elsif(/equation_of_state:/){
  my $ecm=$stuff[5];
  my $midy=log($ecm/0.938);
  my $elab=$stuff[3];
  my $plab=$stuff[7];
 }
 elsif(/event#/){
  $noe++                    # numbers of events: noe
 }      
 else{
  if($#stuff==14){ 

   my @x=@stuff[0..3];   
   my @p=@stuff[4..7];
   my @id=@stuff[8..11];

   my $mass=$id[0];
   my $ityp=$id[1];
   my $iz2=$id[2];
   my $charge=$id[3];

# ab hier steht folgende info zur verfuegung:

# stuff[0] = r_0    = $x[0]
# stuff[1] = r_x    = $x[1]
# stuff[2] = r_y    .
# stuff[3] = r_z    .
# stuff[4] = p_0    = $p[0]
# stuff[5] = p_x    = $p[1]
# stuff[6] = p_y    .
# stuff[7] = p_z    .
# stuff[8] = mass   = $id[0]
# stuff[9] = ityp   = $id[1]
# stuff[10]= iz2    = $id[2]
# stuff[11]= charge = $id[3]

   if ($ityp==27) {
    $count_event_27++;
    print("lambda \n");
    print("Event", $noe, "\n");
    # Wenn der event des Typs "27" mindestens zwei mal aufgetaucht ist...
    if ($count_event_27++; >= 2){
      print("match");
     # es könnte sinnvoll sein den zähler wieder zurück zu setzen,
     # oder die bedingung auf ==2 zu setzen.
     # Aber ich weiss nicht genug über die Logick um dir da zu helfen
    }
   }
  } 
 }
}


[/quote]
<< |< 1 2 3 >| >> 24 Einträge, 3 Seiten



View all threads created 2009-02-10 16:37.