如何使用tcl读取文件中的多行?这是默认情况下,gets命令读取直到找到新行,如何更改此行为以读取文件,直到找到特定字符?
答案 0 :(得分:4)
如果您不介意阅读,可以通过循环使用gets
或read
来完成:
set data ""
while {[gets $chan line] >= 0} {
set idx [string first $whatToLookFor $line]
if {$idx == -1} {
append data $line\n
} else {
# Decrement idx; don't want first character of $whatToLookFor
append data [string range $line 0 [incr idx -1]]
break
}
}
# Data has everything up to but not including $whatToLookFor
如果您正在寻找多线模式,我建议将整个文件读入内存并进行处理。它比尝试编写正确的匹配器容易得多:
set data [read $chan]
set idx [string first $whatToLookFor $data]
if {$idx > -1} {
set data [string range $data 0 [incr idx -1]]
}
后一种形式也适用于二进制数据。如果你这样做,请记住先fconfigure $chan -translation binary
。
答案 1 :(得分:3)
使用fconfigure
。
set fp [open "somefile" r]
fconfigure $fp -eofchar "char"
set data [read $fp]
close $fp
答案 2 :(得分:2)
除了Donal的好建议之外,您还可以通过阅读整个文件并在记录分隔符上拆分来获取记录列表:
package require textutil::split
set records [textutil::splitx [read $chan] "record_separator"]