Как я могу разделить переменную построчно в TCL? - PullRequest
0 голосов
/ 17 января 2019

У меня есть переменная с именем "results" с этим значением:

{0 0 0 0 0 0 0 0 0 0 0 3054 11013}
{0 0 0 0 0 0 0 0 0 0 0 5 13 15}
{0.000 3272.744 12702.352 30868.696}

Я хотел бы сохранить каждую строку (значения между '{}') в отдельной переменной, а затем сравнить каждый из элементов каждой строки с порогом (этот порог будет разным для каждой строки, поэтому Мне нужно их разделить).

Я пробовал

set result [split $results \n]

Но на самом деле это не дает мне аккуратный список элементов. Любой, чтобы получить 3 списка из переменной "результаты"?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Если я правильно понимаю, и представление ваших примерных данных является точным, то вам не нужно обрабатывать ([split]) данные, хранящиеся в results, но оставьте это анализатору списка Tcl. Другими словами, входные данные уже являются допустимым строковым представлением списка Tcl, подходящего для дальнейшей обработки. Смотреть:

set results {
    {0 0 0 0 1}
    {2 2 3 3 3}
    {1 1 2 3 4}
};

set thresholds {
    3
    2
    1
}

lmap values $results threshold $thresholds {
    lmap v $values {expr {$v >= $threshold}}
}

Это даст:

{0 0 0 0 0} {1 1 1 1 1} {1 1 1 1 1}

Справочная информация: когда [lmap] обрабатывается $results, он автоматически превращается в список.

0 голосов
/ 17 января 2019

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

set results "{0 0 0 0 1}
{2 2 3 3 3}
{1 1 2 3 4}";
set result [split $results \n];
foreach line $result {
if {[regexp {^\s*\{(.+)\}\s*} $line Complete_Match Content]} {
puts "$Content\n";
}
}
...