Как извлечь определенные значения из файла в 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

здесь нет пробелов между строками $$


tcl
person naxx    schedule 09.03.2011    source источник


Ответы (2)


В такой ситуации могут помочь регулярное выражение или строковый формат. Однако из приведенного образца не сразу понятно, какой формат у файла; трудно точно сказать, какие фрагменты интересны, каковы масштабы вариации отдельных фрагментов и т. д. Тем не менее, мы можем сделать несколько шагов:

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 для сопоставления, но я недостаточно хорошо понимаю формат, чтобы сказать, какой RE использовать.

person Donal Fellows    schedule 09.03.2011
comment
@DKF - настоящим я обещаю никогда не публиковать еще один ответ о Tcl :-) вы всегда меня опережаете и при этом пишете лучшие ответы. Мы все ценим ваше время и знания - Большое спасибо! - person Nir Levy; 09.03.2011
comment
@Nir: практика практика практика :-) - person Donal Fellows; 09.03.2011
comment
+1 и респект обоим, вопрос показался мне тарабарщиной, не говоря уже о том, чтобы решить его. - person Sii; 10.03.2011

В проекте 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

РЕДАКТИРОВАТЬ: но, пожалуйста, посмотрите ответ Донала, так как я считаю его лучше, чем мой собственный.

person Nir Levy    schedule 09.03.2011