2016-06-18 4 views
0

私のファイルは以下のようになります。私はそれをさらに使用できるようにファイルからid、pos、およびtypeだけを抽出したい。このデータをリストとして扱い、lindex構文を使って検索する必要があります。TCLを使用してファイルから必要な行を抽出する方法は?

{粒子{IDのPOS型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}}

これは私が以下で使用しているコードです。私が使用したコードは誰でも私には正しいかどうかは知ることができます。

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 

答えて

1

疑わしいと思われる行がいくつかあります。

1:

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

whileの結果は空の文字列であるので、上記のコードは、おそらくあなたが望んでやっていません。しかし、それをどう修正するかについてはあまりよく分かりません。 blockfileは標準のTclコマンドではありません。

2:

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

そうでもない正し問題が、それは次のように書くことができます。

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

生成されたバイトコードは実質的に同一となりますが、それは短く、読みやすくなります。

3:

set tlist [expr $i] 

これは不要とsuspcious見えます。我々はiが数値変数(実際には整数を含む)であることを知っているので、それが表現であるとふり返す必要はありません。それは利益のために物事を遅くする。

これは2回発生しました。

4:

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

この行は間違いなく間違っています。 ]文字の数が[文字の数と一致しないため、「予期せぬ」となり、+0は役に立たないか、または有害なものになります。おそらくこれを手助けする手続きを書くのが最善でしょう。プロシージャをスクリプトの先頭に置きます。

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

それからちょうど後でそれを呼び出す:

set total1 [length $x0 $y0 $z0] 

同じことが、後にtotal2の計算に適用されます。 dist"代わりのdist

5:これは誤植を持っているよう

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

が見えます。ループ内でdistを使用できないことも奇妙に見えます。私はあなたがここで間違っていると思うし、もう一度見て、あなたが実際にやりたいことを考えなければなりません。

+0

貴重なご意見ありがとうございました。私はそれらの変更を行います。 – user1640402

+0

私は2点間の距離を求め、各点の合計を計算したいので、+ 0を使用しました。どのように私はすべての行の合計を行うことができますか? – user1640402

関連する問題