2016-06-18 2 views
0

Meine Datei sieht wie folgt aus. Ich möchte nur ID, POS und Typ aus Datei extrahieren, so dass ich es weiter verwenden kann. Sollte ich diese Daten als eine Liste behandeln und die Lindex-Syntax verwenden müssen, um abzurufen.Wie extrahiert man die benötigten Zeilen mit TCL aus einer Datei?

{Partikel {id pos Typ vf} { 0 442,3601602032813 775,8494355067412 339,7428247245854 0 -1,0649468656691174 0,3118359585805807 0,7974629587243917 -7,856415738784473 120,82920096524781 80,7680149353967 } {1 75,78431491144367 187,28007812237516 279,3569202413006 0 0,3317344469183915 3,0716559473604916 -1,679965732986453 2,573367640795655 -11,46026754809828 125,75306472245369 } {2 44,167251258358164 371,8839725825084 80,32709197838003 0 -0,6260768510694417 0,9493261445672099 0,9445444874655268 -98,8132600015945 -80,10617403827258 43,578514821777155 } {3 289,0168944249348 193,4364952458922 96,30251497465443 0 -0,5327035586676473 1,028492567403681 4,364969924730662 139,09290151549465 75,46717320097427 -29,955066397359094} {4 324,94257366360085 404,9215380451672 799,3481016151578 0 -1,2801842708841038 -4,320355658821216 2,9394195915181567 -109,72971491904342 -44,06068452005151 118,2802261191011} {5 598,4521733790556 447,74320547029174 750,4399422142899 0 1,740414834859398 -0,5926143788565617 1,5937397085063156 -155,08309023301794 186,08101953841978 177,1804659692657} }

Dies ist der Code, den ich unten verwendet haben. Kann mir jemand den Code nennen, den ich benutzt habe, stimmt das oder nicht.

set num_part 6 
set mol1 0.1666 
set mol2 0.8333 
set num_conf 2 
for {set i 0} {$i < $num_conf} {incr i} { 
set f [open "config_$i" "r"] 
set part [while { [blockfile $f read auto] != "eof" } {} ] 
set g [open "positions" "w"] 
blockfile $g write particles {id pos type} 
close $f 
close $g 
set g [open "positions" "r"] 
set data [read $g] 
close $g 
set num0 0 
for {set j 0} {$j < [expr { $num_part + 1 }]} {incr j} { 
    set type [lindex $data 0 $j 4] 
    if { $type == 0 } { 
     set tlist [expr $i] 
     set x0 [lindex $data 0 $j 1] 
     set y0 [lindex $data 0 $j 2] 
     set z0 [lindex $data 0 $j 3] 
     set total1 [ expr { sqrt(($x0 * $x0) + ($y0 * $y0)+ ($z0 * $z0)) }]+0] 
     incr num0 
     puts " $i :: $num0 " 
     set dum 0 
     for {set k 0} {$k < [expr { $num_part + 1 }]} {incr k} { 
      set type [lindex $data 0 $k 4] 
      if { $type == 1 } { 
       set tlist [expr $i] 
       set x1 [lindex $data 0 $k 1] 
       set y1 [lindex $data 0 $k 2] 
       set z1 [lindex $data 0 $k 3] 
       set total2 [ expr { sqrt(($x1 * $x1) + ($y1 * $y1)+ ($z1 * $z1)) }]+0] 
       incr dum 
       puts " $i :: $dum " 
       } 
      } 
     } 
    } 
} 
set h [open "dist12" "w"] 
set dist12 [ expr {($mol1 * $total1)-($mol2 * $total2)}] 
puts "Distance between cross particles $dist12" 
puts $h "\# t $dist12 " 
foreach t $tlist dist" $dist12 { puts $h "$t $dist_12" } 
close $h 

Antwort

1

Sie haben ein paar Zeilen, die verdächtig aussehen.

1:

set part [while { [blockfile $f read auto] != "eof" } {} ] 

Das Ergebnis while ist ein leerer String, also wahrscheinlich der obige Code ist nicht das, was tun Sie hoffen. Nicht ganz sicher, wie ich es beheben soll; blockfile ist kein Standard-Tcl-Befehl.

2:

for {set j 0} {$j < [expr { $num_part + 1 }]} {incr j} { 

Nicht wirklich ein Korrektheit Problem, aber das geschrieben werden als:

for {set j 0} {$j < $num_part + 1} {incr j} { 

Der Bytecode erzeugt wird nahezu identisch sein, aber es ist kürzer und leichter zu lesen .

3:

set tlist [expr $i] 

Das sieht nicht notwendig und suspcious. Wir wissen, dass i eine numerische Variable ist (tatsächlich enthält sie eine ganze Zahl), also muss man nicht vorgeben, dass es sich um einen Ausdruck handelt. Es verlangsamt die Dinge ohne Nutzen.

Sie haben zwei Vorkommen davon.

4:

set total1 [ expr { sqrt(($x0 * $x0) + ($y0 * $y0)+ ($z0 * $z0)) }]+0] 

Diese Linie definitiv falsch ist. Die Anzahl der Zeichen ] stimmt nicht mit der Anzahl der Zeichen [ überein. Das Ergebnis ist also "unerwartet" und +0 ist entweder nutzlos oder schädlich. Es ist wahrscheinlich am besten, eine Prozedur zu schreiben, die Ihnen dabei hilft. Legen Sie die Prozedur oben im Skript ab.

proc length {x y z} { 
    expr { sqrt($x*$x + $y*$y + $z*$z) } 
} 

Dann ist es nur später nennen:

set total1 [length $x0 $y0 $z0] 

Das gleiche gilt für die Berechnung der total2 später.

5:

foreach t $tlist dist" $dist12 { puts $h "$t $dist_12" } 

Sieht aus wie dies ein Tippfehler: dist" statt dist. Der Fehler, dist in der Schleife zu verwenden, sieht auch seltsam aus; Ich denke, hier liegst du falsch und solltest noch einmal nachdenken und darüber nachdenken, was du eigentlich machen willst.

+0

Vielen Dank für Ihre wertvollen Vorschläge. Ich werde diese Änderungen vornehmen. – user1640402

+0

Ich möchte den Abstand zwischen zwei Punkten finden und summiere jeden Punkt, also habe ich +0 dafür benutzt. Wie kann ich alle Zeilen zusammenfassen? – user1640402

Verwandte Themen