2016-04-21 23 views
-3

我有兩個文件,我想像下面的輸出。請幫我提供一個TCL腳本。如何比較不同文件中的兩行並在TCL的另一行中輸出相同的位置?

File1中:

Name1: F * F F F 
Name2: F F * 
Name3: F F F F 

文件2:

Name1: AA, BB, CC, DD, EE, 
Name2: AA, BB, CC, 
Name3: AA, BB, CC, DD, 

輸出1:

Name1 
    AA - FAIL 
    BB - * 
    CC - FAIL 
    <cont> 
Name2 
    AA - FAIL 
    BB - FAIL 
    CC - * 
    <cont> 

輸出2:

Name1 
    FAIL - AA CC DD EE 
    * - BB 
Name2 
    FAIL - AA BB 
    * - CC 
Name3 
    FAIL - AA BB CC DD 
+0

Did y你試圖寫一些代碼行嗎? – purplepsycho

+0

是的,我從FILE1和FILE2獲得列表,現在我的問題是如何獲得像上面那樣的輸出。 – aresjay

+0

實際上,在我爲FILE1和FILE2獲取該信息之前,它的一個長代碼,問題在於輸出。 – aresjay

回答

0

試一下這個繼tclsh8.5

set fd1 [open "input_file_1.txt" r] 
set fd2 [open "input_file_2.txt" r] 
set opfd [open "output_file.txt" w] 

while {[gets $fd1 line] > 0 && [gets $fd2 line2] > 0} { 
    set line1 [split $line ":"] 
    set line2 [split $line2 ":"] 
    puts $opfd [lindex $line1 0] 

    set last_part_1 [string trim [lindex $line1 1] " "] 
    set last_part_2 [string trim [lindex $line2 1] " "] 

    set space_split [split $last_part_1 " "] 
    set comma_split [split $last_part_2 ","] 

    for {set i 0} {$i < [llength $space_split]} {incr i} { 
     puts $opfd "[string trim [lindex $comma_split $i] " "] = [string trim [lindex $space_split $i] " "]" 
    } 
} 

close $fd1 
close $fd2 
close $opfd 

測試將會有文件命名爲其中包含您的輸出電流目錄中創建output_file.txt

+0

這項工作非常感謝您的幫助。 – aresjay

+0

如果你覺得這有幫助。請接受答案.. –

+0

如果OUTPUT2,謝謝 – aresjay

0

另一種方式來做到這一點:

package require fileutil 

proc getInput filename { 
    set contents [string trim [::fileutil::cat $filename]] 
    set rows [split $contents \n] 
    concat {*}[lmap item $rows { 
     split $item : 
    }] 
} 

set d1 [string map {F Fail} [getInput file1.txt]] 
set d2 [string map {, {}} [getInput file2.txt]] 
dict for {key values} $d1 { 
    puts $key 
    foreach v1 $values v2 [dict get $d2 $key] { 
     puts " $v2 - $v1" 
    } 
} 

這是通過識別數據文件的字典狀結構。如果每一條數據都是一個沒有空格的詞,這個版本的getInput將強制每個文件的內容到一個可用的dict。從那裏開始,只需要用Fail字符串替換F字符串並刪除逗號,然後在dict之一上進行字典迭代並從另一個字符串中提取相應的值。

如果在第二個文件中的值可能會包含空格,getInput應該是這樣的:

proc getInput filename { 
    set contents [string trim [::fileutil::cat $filename]] 
    set rows [split $contents \n] 
    set res {} 
    foreach item $rows { 
     lassign [split $item :] key values 
     if {[string match *,* $values]} { 
      set values [split [string trimright $values {, }] ,] 
     } 
     lappend res $key $values 
    } 
    return $res 
} 

文檔:concatdictforeachiflassignlmaplmap更換,packageprocputsreturn,set, split,string

相關問題