2012-07-26 42 views
1

我有一個文件測試1:如何標記文件中的行?

Par1 
Par2 
Par3 
Par4 
Par1 
Par5 
Par5 

我做了這個的Tcl對其進行過濾:

set thefile [open test1 "r"] 
set is_Par1 0 
set is_Par3 0 
while {![eof $thefile]} { 
    set line [gets $thefile] 
    if { [regexp {Par1} $line] } { 
      set thefile2 [open test2 "w"] 
      set is_Par1 1 
    } 
    if { [regexp {Par3} $line] } { 
      set is_Par3 1 
      set is_Par1 0 
    } 
    if { $is_Par1 && !$is_Par3 } { 
      puts $thefile2 $line 
    } 
    if { [regexp {Par4} $line] } { 
      set is_Par3 0 
      close $thefile2 
    } 
} 
close $thefile 

讓我們假設該文件和圖案都比較複雜(我已經簡化它)

我有這樣的結果:

Par1 
Par5 
Par5 

但我想有這樣的結果:

Par1 
Par2 

我不明白是我的錯!

回答

2

你不想eof控制while循環:http://phaseit.net/claird/comp.lang.tcl/fmm.html#eof

假設您想要開始在第一則Par1線和印刷停在Par4和e xclude所有Par3的線路:

set f_in [open test1 r] 
set f_out [open test2 w] 
set started false 
while {[gets $f_in line] != -1} { 
    if {[string first Par1 $line] != -1} {set started true} 
    if {!$started} continue 
    if {[string first Par3 $line] != -1} continue 
    if {[string first Par4 $line] != -1} break 
    puts $f_out $line 
} 
close $f_in 
close $f_out 
+0

好的,很好的解決方案謝謝 – heyhey 2012-07-26 14:27:01

+0

+1對於'eof'提示 – kostix 2012-07-27 08:06:15

2

當您在輸入中遇到第一個Par1時打開輸出文件,然後在您讀取第一個Par4時關閉它。到現在爲止還挺好。但是,當你到達第二個Par1時,你只需繼續閱讀並重新打開輸出文件即可。這會覆蓋輸出文件!

所以我的猜測是你想在找到第一個Par4後停止閱讀輸入,對吧?

+0

是的,我想停止閱讀 – heyhey 2012-07-26 11:56:33

2

的問題是,你的代碼是開放的test2文件中第一次看到Par1,寫幾行,關閉它,當它看到Par4,然後打開它再次下一次它看到Par1的模式使其在添加更多行之前將文件截斷爲零。當你發現你的第一個Par4(該文件時自動腳本終止關閉,當然)。

要麼停止處理從test1線(由break荷蘭國際集團外環),或追加方式打開,以便至少有趣的線第一負載不迷路:

set thefile2 [open test2 "a"] 
+0

我不想追加,我想僅僅是第一部分,也許我應該打開我的文件,而在外面? – heyhey 2012-07-26 12:00:19

+0

@heyhey:在一段時間之外打開文件會減少混淆的數量,一旦你找到了所有你想要的東西,你應該從循環中「斷開」。在完成所有有用的工作後繼續工作只是浪費。 – 2012-07-27 10:44:49

+0

好的,謝謝我會盡力記住 – heyhey 2012-07-31 08:57:43

相關問題