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

file auslesen und bestimmte daten speichern

Leser: 1


<< >> 10 Einträge, 1 Seite
Gast Gast
 2007-07-27 20:37
#78986 #78986
hi

also ich würde gern mit perl eine datei öffnen in der eine menge zahlen in spalten durch lehrzeichen getrennt stehn... ich speiche diese dann in arrays und suche nach bestimmten kriterien, wenn ich fündig werde möchte ich die komplette zeile in eine neue datei speichern

ich bin schon so weit weiss aber jetzt nimmer wie ich weiter machen soll:
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
#!/usr/bin/perl
while(<>) {
@stuff=split(' ');
if(/UQMD/){
}
elsif(/projectile:/){
$protar=$_
}
elsif(/equation_of_state:/){
$ecm=$stuff[5];
$elab=$stuff[3];
$plab=$stuff[7];
}
elsif(/event#/){
$noe++ # numbers of events: noe
}
else{
if($#stuff==14||$#stuff==13){

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

$mass=$id[0];
$ityp=$id[1];
$iz2=$id[2];
$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]

# hier bestimm ich was ich suche
if ($ityp==1){

open(file, ">sort.txt");
print file ("! ",$protar);
print file ("!number/event:",$number/$noe," ,ev:",$noe,"\n");
foreach $i(0 .. $#n){
print file ($x[0],"",$x[1],"",$x[2],"",$x[3],"",$p[0],"",$p[1],"",$p[2],"",$p[3],"",$id[0],"",$id[1],"", $id[2],"", $id[3],"\n")
}
close(file);

das problem ist dass es irgendwie nich funktioniert und ich weiss nich woran es liegt\n\n

<!--EDIT|renee|1185560084-->
RPerl
 2007-07-27 20:40
#78987 #78987
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo,

benutz bitte strict / warnings und evtl. diagnostics und benutz die code-tags.

>das problem ist dass es irgendwie nich funktioniert und ich weiss nich woran es liegt
was genau funktioniert denn nicht?

kannst du mal eine dummy textfile geben?\n\n

<!--EDIT|RPerl|1185554467-->
quant82
 2007-07-27 21:02
#78988 #78988
User since
2007-07-27
13 Artikel
BenutzerIn
[default_avatar]
danke für die rasche antwort, ich paste mal ein bischen aus der file die ich einlese hoffe es hilft weiter... ich bekomme beim ausführe der datei immer einen syntax fehler

der file ist folgendermaßen aufgebaut: oben ist ein kopf und dann kommt die liste mit den zahlen die in spalten sortiert ist

UQMD version: 20030 1000 20030 output_file 14
projectile: (mass, char) 208 82 target: (mass, char) 208 82
transformation betas (NN,lab,pro) 0.0000000 0.9941886 -0.9941886
impact_parameter_real/min/max(fm): 3.00 0.00 3.00 total_cross_section(mbarn): 282.74
equation_of_state: 0 E_lab(GeV/u): 0.1600E+03 sqrt(s)(GeV): 0.1743E+02 p_lab(GeV/u): 0.1609E+03
event# 1 random seed: 1179128797 (auto) total_time(fm/c): 2000 Delta(t)_O(fm/c): 2000.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

ab hier beginnt die liste es sind immer 13 zahlen in einer zeile


pvec: r0 rx ry rz p0 px py pz m ityp 2i3 chg lcl# ncl or
2566 2000
4956 982 3973 1 2409 3083 0 0
0.20000000E+04 -0.43339133E+02 -0.83744754E+02 0.19753227E+04 0.63633301E+01 -0.13903707E+00 -0.27834355E+00 0.62861212E+01 0.93800002E+00 1 1 1 1 6 20
0.20000000E+04 -0.56600403E+01 0.45993928E+02 -0.19778399E+04 0.65642889E+01 -0.38503306E-02 0.15418407E+00 -0.64950949E+01 0.93800002E+00 1 1 1 385 5 20
0.20000000E+04 -0.50924952E+03 0.13071823E+04 0.30392022E+03 0.13437030E+01 -0.34236838E+00 0.87548364E+00 0.20495389E+00 0.93800002E+00 1 1 1 3 9 20
0.20000000E+04 -0.10807660E+04 0.41204525E+03 -0.12482049E+04 0.17912572E+01 -0.96943549E+00 0.36747531E+00 -0.11197835E+01 0.93800002E+00 1 1 1 4 25 20
0.20000000E+04 -0.39800269E+01 -0.39425126E+02 -0.19883944E+04 0.96360544E+01 -0.24451361E-01 -0.20808413E+00 -0.95880031E+01 0.93800002E+00 1 1 1 239 26 20
0.20000000E+04 0.48578135E+03 0.13936349E+04 0.49813473E+03 0.17874496E+01 0.43436332E+00 0.12496582E+01 0.44632142E+00 0.11160001E+01 27 0 0 6 24 20
0.20000000E+04 -0.24373336E+02 -0.39086805E+03 0.16899480E+04 0.18994265E+01 -0.28889550E-01 -0.37206456E+00 0.16089469E+01 0.93800002E+00 1 -1 0 7 20 20
0.20000000E+04 -0.41104426E+03 0.12103910E+04 0.14126846E+04 0.40128279E+01 -0.83394111E+00 0.24347548E+01 0.28387382E+01 0.11920000E+01 40 -2 -1 8 16 20
0.20000000E+04 0.70071710E+03 0.75088900E+03 0.40020111E+03 0.14291136E+01 0.50176377E+00 0.53589103E+00 0.28732477E+00 0.11920000E+01 40 0 0 0 13 20
0.20000000E+04 -0.31140710E+03 0.41213195E+03 0.17243292E+04 0.21514551E+01 -0.33944883E+00 0.44235606E+00 0.18541873E+01 0.93800002E+00 1 1 1 367 11 20
0.20000000E+04 -0.53461878E+03 -0.19182372E+03 0.17212880E+04 0.22167820E+01 -0.58831692E+00 -0.21236485E+00 0.19086809E+01 0.93800002E+00 1 -1 0 11 11 20
0.20000000E+04 -0.36313144E+03 0.98361995E+02 0.19077208E+04 0.50967221E+01 -0.93159359E+00 0.25738263E+00 0.48602057E+01 0.11920000E+01 40 0 0 12 7 20
0.20000000E+04 0.65566753E+02 -0.53552798E+03 0.18724560E+04 0.42489091E+01 0.14222423E+00 -0.11524707E+01 0.39780608E+01 0.93800002E+00 1 1 1 423 9 20


ich bekomme immer folgenden fehler

Quote
timo@timo-lnx:~/perl$ perl id_sort.pl test.f14
syntax error at id_sort.pl line 60, near ")

print"
Execution of id_sort.pl aborted due to compilation errors.
timo@timo-lnx:~/perl$
\n\n

<!--EDIT|quant82|1185558805-->
RPerl
 2007-07-27 22:23
#78989 #78989
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Musst Du auch den Namen der Spalte genau wissen?
Weil dann wuerde sich wohl eher ein hash anbieten. Natuerlich in Kombination mit einem Regex.

// Edit:
also eine ganze Zeile (r0 - m) bekommst du hiermit gematched:

Code: (dl )
(.*\d\.\d+\w\+0\d)


Dann koennte man das in ein array pushen (jede zeile) und dann split() benutzen um die zu trennen.
Aber Du kannst ja mal warten was Renee dazu sagt, der weiß das bestimmt :) .. oder?

schoenen gruß,

rPerl\n\n

<!--EDIT|RPerl|1185561823-->
quant82
 2007-07-27 22:51
#78990 #78990
User since
2007-07-27
13 Artikel
BenutzerIn
[default_avatar]
huhu

also ich bin jetzt nen stück weiter, ich kann den code ausführen und er geht, bis auf, wenn ich eine andere ityp auswähle ändert er es nich also er sucht immer nur die zeilen wo der $ityp=101 ist, ich will aber auch andere suchen können... irgendwie finde ich den fehler nich

hier der neue 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/perl

# y  %  mean p_x (y)  

$dy=.1;

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

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

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

   $mass=$id[0];
   $ityp=$id[1];
   $iz2=$id[2];
   $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 ($id[1]== 40){
#if ($ityp== 40 ){
#   if ($ityp==1 && $charge==1){
    $number++;
    $pp=sqrt($p[1]*$p[1]+$p[2]*$p[2]+$p[3]*$p[3]);
    $y=0.5*log(($pp+$p[3])/($pp-$p[3]));
    $ymin=-4.05;
    $iy=int(($y-$ymin)/$dy);
 
    $n[$iy]++;
    
    $symfac=1;
    if ($sym==1){
     $symfac=2;
     $number++;
     $y=-0.5*log(($p[0]+$p[3])/($p[0]-$p[3]));
     $ymin=-20;
     $iy=int(($y-$ymin)/$dy);
 
     $n[$iy]++;
    }
   }
   }
  }
 } 

$midy=0;

open(file, ">ausgabe.txt");

print file ("! ",$protar);
print file ("!number/event:",$number/$noe," ,ev:",$noe,"\n");
print file ("\n");
print file ("r_0"," ","r_x"," ","r_y"," ","r_z"," ","p_0"," ","p_x"," ","p_y"," ","p_z"," ","mass"," ","ityp"," ","iz2"," ","charge"," \n");
foreach $i(0 .. $#n){
 print file ($x[0]," ",$x[1]," ",$x[2]," ",$x[3]," ",$p[0]," ",$p[1]," ",$p[2]," ",$p[3]," ",$id[0]," ",$id[1]," ",$id[2]," ",$id[3],"\n")

}
close (file);


hierein kurzer auszug aus der ausgabe-file:

! projectile: (ityp, char) -1 -1 target: (mass, char) 196 79
!number/event:0.5078 ,ev:10000

r_0 r_x r_y r_z p_0 p_x p_y p_z mass ityp iz2 charge
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
0.20000000E+04 -0.13675036E+04 0.51647176E+03 0.98528947E+03 0.33243349E+00 -0.24772427E+00 0.80403802E-01 0.15373985E+00 0.13800000E+00 101 2 1
RPerl
 2007-07-27 23:28
#78991 #78991
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Sorry, aber mir sagt dein code so ueberhaupt nicht zu..
Wie gesagt, ich wuerde es so aehnlich machen.. (Betonung auf soaehnlich)

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
#!/usr/bin/perl
# das ganze muss NATUERLICH noch entsprechend angepasst werden
use warnings;
use strict;
use diagnostics;

my $content = "
crap crap crap
0.20000000E+04 -0.43339133E+02 -0.83744754E+02 0.19753227E+04  0.63633301E+01 -0.13903707E+00 -0.27834355E+00  0.62861212E+01  0.93800002E+00 1 1 1 1 6 20
blalblah
";
my $regex = '(.*\d\.\d+\w\+0\d\s\d*\s\d\s\d\s\d\s\d\s\d+)';


my ($tmp1) = $content =~ /$regex/m;
my @foo = split(/\s/, $tmp1);



foreach (@foo) {
    print;
    print "\n";
}


EDIT: aendern sich die Spaltennamen?\n\n

<!--EDIT|RPerl|1185564604-->
quant82
 2007-07-28 00:18
#78992 #78992
User since
2007-07-27
13 Artikel
BenutzerIn
[default_avatar]
huhu

jo also ich muss gestehn ich versteh deinen code garnich, liegt wohl auch daran dass ich erst seit 2 tagen überhaupt mit perl hantiere ^^

ansonsten ist es so die spalten sind ab dem zeitpunkt wenn der kopf vorbei ist immer gleich also nur solche zahlen spallten... allerdings ist es so dass ich mit den werten aus bestimmten spalten wenn mir der ityp true liefert auch rechnen will, also einerseits will ich nur bestimmte zeilen erst mal auslesen und in eine neue datei schreiben und im 2. schritt dann mit den werten der spalten rechnen, hoffe ich habs verständlich ausgedrückt

und die dateien die ich auslese sind relativ groß so 400mb bis hin zu mehreren gig\n\n

<!--EDIT|quant82|1185567581-->
RPerl
 2007-07-28 00:29
#78993 #78993
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo,

Quote
jo also ich muss gestehn ich versteh deinen code garnich, liegt wohl auch daran dass ich erst seit 2 tagen überhaupt mit perl hantiere ^^

Macht doch nichts. Ich code ja auch schon perl seit 3 Jaehrchen.

Quote
ansonsten ist es so die spalten sind ab dem zeitpunkt wenn der kopf vorbei ist immer gleich also nur solche zahlen spallten... allerdings ist es so dass ich mit den werten aus bestimmten spalten wenn mir der ityp true liefert auch rechnen will, also einerseits will ich nur bestimmte zeilen erst mal auslesen und in eine neue datei schreiben und im 2. schritt dann mit den werten der spalten rechnen, hoffe ich habs verständlich ausgedrückt


Ok, der ityp wert in diesem beispiel:

Code: (dl )
0.20000000E+04 -0.36313144E+03  0.98361995E+02  0.19077208E+04  0.50967221E+01 -0.93159359E+00  0.25738263E+00  0.48602057E+01  0.11920000E+01         40  0  0       12    7  20


.. ist 40, richtig?
Vllt. reicht es dir ja auch, nur diese 40 bzw. den ityp wert herauszuziehen. Brauchst du alle? Welche genau brauchst du?

Ich werde morgend danach nochmal schauen, aber vielleicht hat Renee bis dahin das Problem komplett geloest - wer weiß.

Gruß und gn8

rPerl
RPerl
 2007-07-28 11:32
#78994 #78994
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Mir ist noch was eingefallen(gestern bzw. heute morgen um 2:00 Uhr im Bett *g*), Sichtwort: mehrdimensionale Arrays.

Quote
allerdings ist es so dass ich mit den werten aus bestimmten spalten wenn mir der ityp true liefert auch rechnen will

Also nur, wenn die Spalte "ityp" true ist, die ganze Zeile speichern?
True == 1?

Na, muesst schon machbar sein *denk* ...
quant82
 2007-07-28 15:46
#78995 #78995
User since
2007-07-27
13 Artikel
BenutzerIn
[default_avatar]
jo also ich brauch alle einträge der zeile, da stehn impulse orte masse usw drinne... mit denen muss ich dann weiter rechnen.. naja mir ist noch eingefallen dass vlt irgendwo im speicher der wert ityp=101 gespeichert ist, gibt es eine möglichkeit in perl speicher vlt erst zu löschen, weil es ist ja definitiv so dass ich nirgends im code festelege dass er nur die zeilen mit ityp=101 speichern soll, sondern eigendlich die mit ityp=40\n\n

<!--EDIT|quant82|1185623210-->
<< >> 10 Einträge, 1 Seite



View all threads created 2007-07-27 20:37.