Arrays 将数据列表到直方图

Arrays 将数据列表到直方图,arrays,tcl,histogram,Arrays,Tcl,Histogram,我正在做一些数据分析,结果是一长串数字。每行由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方面的专家(到目前为止?),我有一些想法如何做到这一点,但我还没有成功。puts语句只是为了让我看到发生了什么 我创建的这个nc数组为我提供了一个基于大小的数组。但是,我想要一个基于每行的数组(2D)。天真地说,这将是nc($item)($

我正在做一些数据分析,结果是一长串数字。每行由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方面的专家(到目前为止?),我有一些想法如何做到这一点,但我还没有成功。puts语句只是为了让我看到发生了什么


我创建的这个nc数组为我提供了一个基于大小的数组。但是,我想要一个基于每行的数组(2D)。天真地说,这将是nc($item)($nlines)。我最初尝试用长度标记数组变量,如nc${item}($nlines),但我不够聪明,无法让它正常工作

谢谢你的帮助。 最好的
Mike

尽管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
输出

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
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}
或使用字典:

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]
}
输出

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
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}

显示要查看的输出。Tcl阵列是严格的一维阵列。您可以使用
dict
制作一本词典。我不确定
nlines
的信息来自何处,您现在的问题是,如果
nlines
项的大小不同,Glenn(此时不是真正的输出)将是nc1(1)=20,nc2(1)=8,nc3(1)=2,nc4(1)=1,其中数组索引是原始数据文件的行号。这是我尝试过的事情之一:nc${item}($lineno)或类似的东西,但我的输出是变量名本身,而不是值。。谢谢Jerry,在我的示例中,
nlines
是正在读取的文件的长度。我觉得你的评论不完整。谢谢小心地将字符串$行视为一个列表——如果它包含不平衡的大括号,您将得到一个错误。注意使用
split
join
在字符串和列表之间进行转换——您应该为每个项目[split$line]{}
设置m[llength[split$line]和
Hi Glenn!好的,我认为(第一个例子)奏效了。
parray
命令确实吐出了内容,尽管顺序有些随机(这不重要,因为我可以像在普通数组中一样控制索引,我会收集?)。我想我需要检查
split
和join命令。我真的很感谢你的帮助!它实际上与“随机顺序”完全相反——它是按词汇排序的。看见