【发布时间】:2020-02-01 22:24:28
【问题描述】:
我正在做一些数据分析,输出是一长串数字。每行由 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 语句只是为了让我可以看到正在发生的事情。
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) 等长度标记数组变量,但我不够聪明,无法让它工作。
感谢您的帮助。 最好的 迈克
【问题讨论】:
-
显示你想看到的输出。 Tcl 数组是严格一维的。您可以使用
dict来制作字典 -
我不确定
nlines的信息来自哪里,你现在的问题是,如果nlines与item的大小不同。跨度> -
Glenn,(此时不是真正输出)将是 nc1(1) = 20, nc2(1) = 8, nc3(1) = 2, nc4(1) = 1,其中数组索引是原始数据文件的行号。这是我尝试过的事情之一:nc${item}($lineno) 或类似的,但我的输出是变量名本身而不是值.. 谢谢!
-
Jerry,在我的示例中,
nlines是正在读取的文件的长度。你的评论对我来说似乎不完整。谢谢! -
小心地将 string $line 视为 list -- 如果它包含不平衡的大括号,则会出现错误。注意使用
split和join在字符串和列表之间进行转换——你应该有set m [llength [split $line]]和foreach item [split $line] {}