【问题标题】:How Can I read TCL file value by value如何按值读取 TCL 文件值
【发布时间】:2018-02-01 12:48:33
【问题描述】:

我在 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

【问题讨论】:

  • 确切的真实文件格式在这里很重要。我们是在处理制表符分隔的值、一般的双空格分隔值还是固定宽度的列处理?
  • 感谢“Mr.Donal Fellows”的回答,当我在文件中打印值时,我添加了“\t”......但如果将文件作为文件读取有问题,我可以删除数组。
  • 你的问题很不清楚。请阅读this

标签: arrays file tcl


【解决方案1】:

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

【讨论】:

  • 感谢“Mr.Donal Fellows”的回答,但是在这种情况下,它会读取所有值.....这个结果已经保存在TCL文件中,所以,我想例如,读取 PUx(1) 的值,但不同时读取所有值,只需获取第一个值,如 1 和 PUx(2) 的第一个值...从数组中读取。跨度>
  • @Qusay 要逐个元素访问PUx 的内容(元素是一个列表),请查看array 上的Tcl 手册页。然后,遍历列表?但也许我不明白这个问题,正如@Jerry 所说的那样模糊地描述。
  • 谢谢,对于这里的每个人,更深入地说,我有一个文件“Xfile”,它保存了我解释过的所有值。现在,我有方程,我想添加 (+) PUx(1)= 1 的第一个值和第一个值 PUx(2)=1 和其他直到 PUx(5),就像这样 Sum=1+ 1+1+1+1。现在,问题是,我想知道如何逐个元素地读取保存在“Xfile”中的这个值。不能同时阅读。
  • 通过“Sum= 1+1+1+1+1”,您指的是按列求和吗?
  • 感谢“先生。Mrcalvin”的回答,我同意你的看法。我们可以说我想将值作为列读取...有任何方法可以以这种方式读取文件中的列。
【解决方案2】:

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

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)

【讨论】:

    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多