Как извлечь конкретные значения из файла в tcl - PullRequest
2 голосов
/ 09 марта 2011
$$ 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 ]

4 голосов
/ 09 марта 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

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

4 голосов
/ 09 марта 2011

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

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 использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...