2014-11-06 28 views
-1

我剛剛開始學習tcl,閱讀大文件時遇到問題。 我有一個類似如下的數據文件:如何使用tcl讀取文件的每個部分?

420 
360 360 360 3434.01913 
P 6.9022 0.781399 -0.86106 
C 4.36397 -0.627479 3.83363 
P 6.90481 5.42772 3.08491 
.... 

結束這樣的:

P -7.21325 1.71285 -0.127325 
C -4.14243 0.41123 4.67585 
420 
.69667 

所以C是一款的最後一行和420是下一節的開始。所以每420行就是整個文件的一部分。 我怎樣才能讀取這個文件的每個部分,並像它說「frame1」一樣,直到文件結尾(包含frame2,frame3和...)。 我想出了一個簡單的腳本只是爲了逐行讀取整個文件,但我不知道該怎麼做。謝謝

+1

向我們展示你的努力來解決這個問題。 – 2014-11-06 15:01:06

+0

好的,這正是我想出的.proc read_xyz_frame {fp n_bp} { set i 0 while {$ i <[expr $ n_bp * 4]} { if {[gets $ fp line]> 0 } { \t字段集[分裂$行「「] L將$字段名稱XYZ 然後我用得到$ fp的線,並通過它來設置n_atoms $ line1.what我想做的事,主要是做,但現在我的問題在每個部分的開頭都有兩個標題行,所以我想跳過它們(如果沒有意義,我不知道正確的術語),然後開始閱讀另一個框架或部分文件。 – amir 2014-11-07 14:55:23

回答

0

您的問題的答案「如何使用tcl讀取文件的每個部分? 「很簡單「繼續閱讀,直到你用完了」。

回答這個問題:「怎麼算的部分,並跳過標題行」是這樣的:

while { ...condition... } { 
    if {[gets $fp line] < 0} break 

    lassign $line name x y z 
    if {$name eq "420"} { 
     incr section_counter 
    } elseif {$name in {P C}} { 
     # do something with the data 
    } 
} 

條件爲您while循環將一次讀取每一行進行測試。一旦整個文件被讀取,第一個if命令就會跳出循環。除非您希望其中一行包含不正確列表的字符串,否則不需要拆分您閱讀的行。將行的字段分配給變量後,您可以查看name以查看您獲得的行數。第二個if命令表示如果$name是字符串「420」,則會增加節計數器。另一方面,如果$name包含「P」或「C」,則需要處理一條數據線。如果這兩個條件都不滿足,則在「420」行後面有一行,這簡直被忽略。

文檔:breakgetsifincrlassignwhile

相關問題