匹配模式并将值添加到 Tcl 中的列表
Matching pattern and adding values to a list in Tcl
我想知道是否可以得到一些建议,我正在尝试通过读取具有如下所示输入的文件来创建列表
来自输入文件的示例
Parameter.Coil = 1
Parameter.Coil.Info = Coil
BaseUTC.TimeSet_v0 = 1
BaseUTC.TimeSet_v0.Info = TimeSet_v0
BaseUTC.TimeSet_v1 = 1
BaseUTC.TimeSet_v1.Info = TimeSet_v1
BaseUTC.TimeSet_v14 = 1
BaseUTC.TimeSet_v14.Info = TimeSet_v14
BaseUTC.TimeSet_v32 = 1
BaseUTC.TimeSet_v32.Info = TimeSet_v32
VC.MILES = 1
VC.MILES.Info = MILES_version1
我对任何前缀为“BaseUTC”的行感兴趣。和“.Info”,并希望在列表中的“=”之后保存值
期望:
output = TimeSet_v0 TimeSet_v1 TimeSet_v14 TimeSet_v32
我尝试了以下但没有得到想要的输出。
set input [open "[pwd]/Data/Input" r]
set list ""
while { [gets $input line] >= 0 } {
incr number
set sline [split $line "\n"]
if {[regexp -- {BaseUTC.} $sline]} {
#puts "lines = $sline"
if {[regexp -- {.Info} $sline]} {
set output [lindex [split $sline "="] 1]
lappend list $output
}}}
puts "output = $list"
close $input
我的输出为
output = \ TimeSet_v0\} \ TimeSet_v1\} \ TimeSet_v14\} \ TimeSet_v32\}
请大家帮忙指出我的错误。
提前谢谢你。
你的很多代码似乎与你的描述不符(转向?我以为你在寻找 BaseUTC 行?),或者只是没有意义(为什么要拆分你已经知道的是换行符的单行字符?),但真正有助于简化事情的一件事是正则表达式捕获组。类似于:
#!/usr/bin/env tclsh
proc process {filename} {
set in [open $filename]
set list {}
while {[gets $in line] >= 0} {
if {[regexp {^BaseUTC\..*\.Info\s+=\s+(.*)} $line -> arg]} {
lappend list $arg
}
}
close $in
return $list
}
puts [process Data/Input]
或者使用通配符代替正则表达式:
proc process {filename} {
set in [open $filename]
set list {}
while {[gets $in line] >= 0} {
lassign [split $line =] var arg
if {[string match {BaseUTC.*.Info} [string trim $var]]} {
lappend list [string trim $arg]
}
}
close $in
return $list
}
我想知道是否可以得到一些建议,我正在尝试通过读取具有如下所示输入的文件来创建列表
来自输入文件的示例
Parameter.Coil = 1
Parameter.Coil.Info = Coil
BaseUTC.TimeSet_v0 = 1
BaseUTC.TimeSet_v0.Info = TimeSet_v0
BaseUTC.TimeSet_v1 = 1
BaseUTC.TimeSet_v1.Info = TimeSet_v1
BaseUTC.TimeSet_v14 = 1
BaseUTC.TimeSet_v14.Info = TimeSet_v14
BaseUTC.TimeSet_v32 = 1
BaseUTC.TimeSet_v32.Info = TimeSet_v32
VC.MILES = 1
VC.MILES.Info = MILES_version1
我对任何前缀为“BaseUTC”的行感兴趣。和“.Info”,并希望在列表中的“=”之后保存值
期望:
output = TimeSet_v0 TimeSet_v1 TimeSet_v14 TimeSet_v32
我尝试了以下但没有得到想要的输出。
set input [open "[pwd]/Data/Input" r]
set list ""
while { [gets $input line] >= 0 } {
incr number
set sline [split $line "\n"]
if {[regexp -- {BaseUTC.} $sline]} {
#puts "lines = $sline"
if {[regexp -- {.Info} $sline]} {
set output [lindex [split $sline "="] 1]
lappend list $output
}}}
puts "output = $list"
close $input
我的输出为
output = \ TimeSet_v0\} \ TimeSet_v1\} \ TimeSet_v14\} \ TimeSet_v32\}
请大家帮忙指出我的错误。
提前谢谢你。
你的很多代码似乎与你的描述不符(转向?我以为你在寻找 BaseUTC 行?),或者只是没有意义(为什么要拆分你已经知道的是换行符的单行字符?),但真正有助于简化事情的一件事是正则表达式捕获组。类似于:
#!/usr/bin/env tclsh
proc process {filename} {
set in [open $filename]
set list {}
while {[gets $in line] >= 0} {
if {[regexp {^BaseUTC\..*\.Info\s+=\s+(.*)} $line -> arg]} {
lappend list $arg
}
}
close $in
return $list
}
puts [process Data/Input]
或者使用通配符代替正则表达式:
proc process {filename} {
set in [open $filename]
set list {}
while {[gets $in line] >= 0} {
lassign [split $line =] var arg
if {[string match {BaseUTC.*.Info} [string trim $var]]} {
lappend list [string trim $arg]
}
}
close $in
return $list
}