如何从tcl中的文件中提取特定值

时间:2011-03-09 09:08:26

标签: tcl

$$ 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

这里没有行$$

之间的空格

2 个答案:

答案 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的回答,因为我发现它比我自己更好。