[英]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 會自動適應它。)如果我們在\n
處split
這些字符,我們會得到這些子字符串: abc
、 bcd
和最后一個\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.