Определить фигурные скобки и несколько экземпляров в списке, используя TCL - PullRequest
0 голосов
/ 09 ноября 2019

Я читаю большой файл, и меня интересует только небольшая часть файла, как показано ниже.

TC.0.Type = Bob 1
TC.1.Type = Mark 1
TC.2.Type =
TC.3.Type =
TC.4.Type = Fred 1
TC.5.Type =
TC.6.Type =
TC.7.Type = 
TC.8.Type =
TC.9.Type = Fred 1

Я создал переменную, которая теперь содержит эту информацию

data = "{Bob 1} {Mark 1} {} {} {Fred 1} {} {} {} {} {Fred 1}"

TC всегда между 0-9, поэтому длина известна.

Я хотел бы сделать следующее:

1) Если есть несколько экземпляров "Фред 1"и удалите его. 2) Найдите первую пустую ячейку и определите индекс.

Вопрос 1) Обычно ли использовать скобки при использовании lappend? Я ожидал, что это будет только в случае пустых полей

set data ""
for {set j 0} {$j < 10} {incr j} {  
    lappend data $fromfile
    }
puts "Data in list = $data"

Вопрос 2) Я даже пытался использовать регулярное выражение для выбора пустых, но, похоже, не удачно.

Найти пустое поле {}

set j 0
for {set i 0} {$i < $ldata} {incr i} {
# set nline [split $data "\s"]
# puts "data ($i) = $nline"
if {[regexp {\{.*\}} $data]} {
   puts " Found {}"
   incr j
   puts "j = $j"
}
}

Найти поле с именем, например, Боб 1

for {set i 0} {$i < $ldata} {incr i} {
if {[regexp {\{.*[a-zA-Z0-9]\}} $data]} {
   puts " Found something with names"
}
}

Буду признателен, если кто-то сможет дать совет и руководство.

1 Ответ

1 голос
/ 09 ноября 2019

Команда lsearch будет чрезвычайно полезна для того, что вы делаете, особенно с опцией -all.

set data "{Bob 1} {Mark 1} {} {} {Fred 1} {} {} {} {} {Fred 1}"
puts [lsearch -all -exact $data "Fred 1"]
# ==> 4 9

Мы также можем использовать его для удаления определенных значений:

puts [lsearch -all -inline -exact -not $data "Fred 1"]
# ==> {Bob 1} {Mark 1} {} {} {} {} {} {}

Чтобы найти первый пустой слот, мы просто делаем:

puts [lsearch -exact $data ""]
# ==> 2

Мы наиболееопределенно ожидал бы скобки назад от операций со списком;Вот как выражаются пустые элементы списка.

...