2012-02-24 106 views
0

我正在嘗試使用tcl腳本將一些數據從iperf寫入文件。該文件有超過100行。現在我需要解析前10行,忽略它,並考慮下一組10行並打印它,再次我需要忽略下一組10行,並打印下10行並繼續下去,直到我到達文件。我怎麼能這樣做它的程序盟友?如何在TCL中處理文件中的每一行

exec c:\\iperf_new\\iperf -c $REF_WLAN_IPAddr -f m -w 2M -i 1 -t $run_time > xx.txt 

set fp [open "xx.txt" r ] 
set file_data [read $fp] 
set data [split $file_data "\n"] 

foreach line $data { 
    if {[regexp {(MBytes) +([0-9\.]*)} $line match pre tput]==1 } { 
     puts "Throughput: $tput Mbps" 
    } 

回答

2

那麼,如您的示例所示,您已經找到了如何將一個(slurped)文件分割成多行並逐個處理它們。

現在實施「跳過十條線,處理十條線,跳過另外十條線」等問題出現了什麼問題?它只是使用一個變量來計算迄今爲止看到的行數,並根據它的值選擇一個代碼分支。這種方法在Tcl方面沒有什麼特別的地方:有可用於計數的命令,有條件地選擇代碼分支和控制循環。

如果基於行計數器的當前值的分支看起來太蹩腳,那麼可以在該計數器變量周圍實現一個state machine。但對於這種簡單的情況,它看起來像過度生成。

另一種方法是使用lrangesplit返回的列表中挑選必要的一系列行。這種方法可能使用的lrange一個不錯的屬性,它可以告訴返回一個子表「因爲這個指數並直至列表的末尾」,因此該解決方案確實可歸結爲:

set lines [split [read $fd] \n] 
parse_header [lrange $lines 0 9] 
puts [join [lrange $lines 10 19] \n] 
parse_something_else [lrange 20 29] 
puts [join [lrange $lines 30 end] \n] 

對於小文件,這解決方案看起來非常緊湊和乾淨

+0

+1而不是一個正常的表情。 jwz會很自豪! – 2012-02-25 08:22:01

0

如果我理解正確的話,你要打印線11-20,31-40,51-60,...以下將做你想要什麼:

package require Tclx 

set counter 0 

for_file line xxx.txt { 
    if {$counter % 20 >= 10} { puts $line } 
    incr counter 
} 

的Tclx包提供了一個從文件讀取行的簡單方法:for_file命令。

相關問題