簡體   English   中英

TCL - 讀取文件,額外行

[英]TCL - read a file, extra line

我寫了下面的腳本,出於某種原因它 output 額外的第 3 行(top out.txt & name)。 如何阻止它輸出最后 2 行到 output 文件。

我認為是因為這一行但不太確定:set lines [split [read $list] "\n"]

Input put file - a.txt
**********************
abc
bcd

Output
*******
top out.txt 
name abc 
top out.txt 
name bcd 
top out.txt 
name 

set outfile      [open "out.txt" w]
set list         [open "a.list" r]
set dir         "[glob a.txt]"

    foreach ddd $dir {
        set lines [split [read $list] "\n"]
        foreach line $lines {
                puts $outfile "top $dir"
                puts $outfile "name $line"
        }
    }
close $list
close $outfile

問題的核心是split使用字段分隔符而不是字段終止符; 這就是您看到兩者之間區別的地方。

如果我們查看文件的字符,我們會看到: a b c \n b c d \n (從技術上講, \n可能改為\r \n\r ;對於文本文件,默認情況下 Tcl 會自動適應它。)如果我們在\nsplit這些字符,我們會得到這些子字符串: abcbcd最后一個\n之后的字符的空字符串 這意味着當我們在所有元素之間使用\n (作為join字符串)連接字符串時,我們會再次得到原始字符串。


你有幾個選擇來處理這個問題。 我最喜歡的是添加代碼來忽略空行; 這個版本對於各種人工編寫的列表特別有用(因為添加注釋跳過也相當容易):

    set lines [split [read $list] "\n"]
    foreach line $lines {
        if {$line eq ""} continue
        puts $outfile "top $dir"
        puts $outfile "name $line"
    }

另一種選擇是使用-nonewline選項read以丟棄最后的\n

    set lines [split [read -nonewline $list] "\n"]
    foreach line $lines {
        puts $outfile "top $dir"
        puts $outfile "name $line"
    }

您也可以在拆分之前將string trimright ,但這會從末尾去除多個換行符(如果它們存在)。

    set lines [split [string trimright [read $list] "\n"] "\n"]
    foreach line $lines {
        puts $outfile "top $dir"
        puts $outfile "name $line"
    }

最后,如果您使用的是機器生成的列表,您可以考慮只讓該代碼不在末尾放置換行符。 有時這是最簡單的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM