$$ comments //not needed
$$ comments /not needed
$$
$$
$$ comments //not needed
$$.INPUT a vcc // needed
$$.OUTPUT o //needed
$$.sdsds
$$
$$.sdsds
$$
$$.sdsdsds
Mg1.qna o a vss vss n 0.36 0.03 mult=4 $$nnn //needed
Mg1.qpa o a vcc vcc p 0.36 0.03 mult=6 $$nnn //needed
这里没有行$$
之间的空格答案 0 :(得分:4)
这是正则表达式或字符串格式可以提供帮助的情况。但是,目前还不清楚文件的格式是来自给定的样本;很难确切知道哪些位有趣,特定部分的变化范围是什么,等等。不过,我们可以采取以下几个步骤:
proc parseFileContents {contents infoVar} {
upvar 1 $infoVar inf
set lineNum 0
foreach line [split $contents "\n"] {
incr lineNum
# Skip comment lines (?)
if {[string match {$*} $line} continue
# Skip blank lines
if {[string trim $line] eq ""} continue
# Parse a "real" line
if {[scan $line "%s%s%s%s%s%s%f%f%s%s" a b c name d e value f g h] == 10} {
set inf($name) $value
} else {
# Oh dear, didn't work!
puts "warning: did not understand line $lineNum\n$line"
}
}
}
使用它:
parseFileContents $theContentsOfTheFile data
puts "Keys: [array names data]"
puts "VSS: $data(vss)"
puts "VCC: $data(vcc)"
如上所述,正则表达式也可以用于解析数据行,使用regexp
而不是scan
进行匹配,但我不能很好地理解格式,以便能够说什么可以使用。
答案 1 :(得分:4)
有几个库可以处理tcllib项目中的纯文本文件,我建议您查看。
如果你坚持自己写一个,你可以使用这样的东西:
set fd [open $filename r]
while { [gets $fd line] >= 0 } {
set data [split $line]
if { [lindex $data 0] == {$} } {
continue; #this is a comment line
}
puts [lindex $line 3]; #or whatever index you need...
}
close $fp
编辑:但请看Donal的回答,因为我发现它比我自己更好。