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