TCL список данных к гистограмме - PullRequest
0 голосов
/ 03 октября 2019

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

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 4

Я хотел бы поместить их в гистограмму (временной ряд). Я не эксперт в tcl (пока?), И у меня есть несколько идей, как это сделать, но я пока не добился успеха. Операторы put предназначены для того, чтобы я мог видеть, что происходит.


while { [gets $infile line] != -1 } {
    set m [llength $line]
    puts "line length $m"
    foreach item $line {
        puts $item
        incr nc($item)
        puts "nc: $nc($item)"
    }
}

этот массив nc, который я создал , равен , давая мне массив на основе размера. Тем не менее, я хотел бы массив на основе строки (2D). Наивно это был бы nc ($ item) ($ nlines). Сначала я пытался пометить переменную массива такой длиной, как nc $ {item} ($ nlines), но я недостаточно умен, чтобы заставить это работать.

Я ценю любую помощь. Лучший Майк

1 Ответ

0 голосов
/ 04 октября 2019

Хотя массивы Tcl являются одномерными, вы можете создать ключевые строки для имитации многомерности:

set lineno -1
set fh [open infile r]

while {[gets $fh line] != -1} {
    incr lineno
    foreach item [split [string trim $line]] {
        incr nc($lineno,$item)
    }
}
close $fh

# `parray` is a handy command for inspecting arrays
parray nc

output

nc(0,1) = 20
nc(0,2) = 8
nc(0,3) = 2
nc(0,4) = 1
nc(1,1) = 2
nc(1,2) = 4
nc(1,4) = 3
nc(2,1) = 1
nc(2,2) = 1
nc(2,3) = 1
nc(2,4) = 1

Или использовать словари:

set lineno -1
set nc {}
set fh [open infile r]

while {[gets $fh line] != -1} {
    set thisLine {}
    foreach item [split [string trim $line]] {
        dict incr thisLine $item
    }
    dict set nc [incr lineno] $thisLine
}
close $fh

dict for {line data} $nc {
    puts [list $line $data]
}

выходы

0 {1 20 2 8 3 2 4 1}
1 {1 2 2 4 4 3}
2 {1 1 2 1 3 1 4 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...