如何按值读取TCL文件值

时间:2018-02-01 12:48:33

标签: arrays file tcl

我在Tcl中有一个文件,我想单独读取每个值作为数组...我认识这样的文件

PUx(1)  1   2   3   4   5   
PUx(2)  1   2   3   4   5   
PUx(3)  1   2   3   4   5   
PUx(4)  1   2   3   4   5   
PUx(5)  1   2   3   4   5

所以,我想逐个得到PUx(1)的值并将其添加到变量中。

enter image description here

2 个答案:

答案 0 :(得分:0)

正如Donal所指出的,这一切都取决于实际的格式。但如果示例数据具有代表性,这可能对您有用:

set content {PUx(1)  1   2   3   4   5   
    PUx(2)  1   2   3   4   5   
    PUx(3)  1   2   3   4   5   
    PUx(4)  1   2   3   4   5   
    PUx(5)  1   2   3   4   5}

foreach line [split $content \n] {
    set values [lassign $line varName]
    set $varName $values
}

parray PUx

lassign假定行方式数据表示有效的Tcl列表。这可能是也可能不是你的情况。

更新

您可能希望重新组织数据集,这将允许您使用Tcl数组习惯用法来访问"行"和"列"数据的直接方式,或多或少:

set content {PUx(1,1)  1
    PUx(1,2) 2
    PUx(1,3) 3
    PUx(1,4) 4
    PUx(1,5) 5
    PUx(2,1) 1
    PUx(2,2) 2
    PUx(2,3) 3
    PUx(2,4) 4
    PUx(2,5) 5}

foreach line [split $content \n] {
    set values [lassign $line varName]
    set $varName $values
}

parray PUx

# first column: *,1
foreach {k v} [array get PUx *,1] {
    puts $v
}

# first row: 1,*
foreach {k v} [array get PUx 1,*] {
    puts $v
}

答案 1 :(得分:0)

如果您主要关心的是如何计算元素列表中的总和,则可以使用以下三个选项:

proc lsum1 {x} {
    set r 0
    foreach i $x {
       incr r $i
    }
    return $r
}

proc lsum2 {x} {
    expr [join $x " + "]
}

proc lsum3 {x} {
    ::tcl::mathop::+ {*}$x
}


set x {1 2 3 4 5}
lsum1 $x
lsum2 $x
lsum3 $x

lsum1lsum3更可取。 lsum2是您所描述的"问题"的文化翻译,至少在我的阅读中。您可能还想查看Tcl wiki。它为您提供了lsum3的详细信息。

这可以很容易地与阅读数据集成,如我的第一个答案所示:

lsum1 $PUx(1)
lsum3 $PUx(1)