TCL - 如何存储和打印值表?

jkt*_*nce 5 tcl

我知道你可以在tcl中"破解"嵌套关联数组,我也知道使用字典(我没有经验),你可以很容易地嵌套它们.我试图找到一种方法来存储具有两个变量的函数的值,然后在最后我只想打印出两个变量(列和行标题)的表,其中包含单元格中的函数值.我可以做这项工作,但它既不简洁也不高效.

这是应该打印的内容.行是b的值,列是a的值(1,2,3,4,5为简单起见):

                          b
          1       2       3       4       5
    1  y(1,1)  y(1,2)  y(1,3)  y(1,4)  y(1,5)
    2  y(2,1)  y(2,2)  y(2,3)  y(2,4)  y(2,5)
  a 3  y(3,1)  y(3,2)  y(3,3)  y(3,4)  y(3,5)
    4  y(4,1)  y(4,2)  y(4,3)  y(4,4)  y(4,5)
    5  y(5,1)  y(5,2)  y(5,3)  y(5,4)  y(5,5)
Run Code Online (Sandbox Code Playgroud)

为了存储它,我想我会简单地在a和b上做两个嵌套for循环,并以某种方式将结果存储在嵌套字典中.就像有一个带有5个条目的字典,每个b的值为1,并且每个条目是b的每个值的另一个字典.

要打印它,我能想到的唯一方法是只显式打印每个表行并调用每个字典条目.我不太熟悉tcl的输出格式,但我可以在那里管理.

谁能想到更优雅的方式呢?

Hai*_* Vu 5

以下是有关如何使用该struct::matrix软件包的几个示例.

示例1 - 简单的创建/显示

package require struct::matrix
package require Tclx

# Create a 3x4 matrix
set m [::struct::matrix]
$m add rows 3
$m add columns 4

# Populate data
$m set rect 0 0 {
    {1 2 3 4}
    {5 6 7 8}
    {9 10 11 12}
}

# Display it
puts "Print matrix, cell by cell:"
loop y 0 [$m rows] {
    loop x 0 [$m columns] {
        puts -nonewline [format "%4d" [$m get cell $x $y]]
    }
    puts ""
}
Run Code Online (Sandbox Code Playgroud)

产量

Print matrix, cell by cell:
   1   2   3   4
   5   6   7   8
   9  10  11  12
Run Code Online (Sandbox Code Playgroud)

讨论

  • 在脚本的第一部分中,我创建了一个矩阵,添加了3行和4列 - 一个直接的过程.
  • 接下来,我打电话set rect给数据填充矩阵.取决于你的需要,你可能想看看set cell,set columnset row.欲了解更多信息,请参阅参考struct::matrix.
  • 说到显示矩阵,而不是使用Tcl的for命令,我更喜欢包中的loop命令Tclx,它更易于阅读和使用.

示例2 - 从CSV文件中读取

package require csv
package require struct::matrix
package require Tclx

# Read a matrix from a CSV file
set m [::struct::matrix]
set fileHandle [open data.csv]
::csv::read2matrix $fileHandle $m "," auto
close $fileHandle

# Displays the matrix
loop y 0 [$m rows] {
    loop x 0 [$m columns] {
        puts -nonewline [format "%4d" [$m get cell $x $y]]
    }
    puts ""
}
Run Code Online (Sandbox Code Playgroud)

数据文件data.csv:

1,2,3,4
5,6,7,8
9,10,11,12
Run Code Online (Sandbox Code Playgroud)

产量

   1   2   3   4
   5   6   7   8
   9  10  11  12
Run Code Online (Sandbox Code Playgroud)

讨论

  • csv软件包提供了一种从CSV文件读取到矩阵的简单方法.
  • 操作的核心在::csv::read2matrix命令中,但在此之前,我必须创建一个空矩阵并打开文件进行读取.
  • 显示矩阵的代码与前面的示例相同.

结论

虽然struct::matrix包装起初看起来很复杂; 我只需要学习一些命令即可开始使用.


and*_*ngo 2

优雅是情人眼中的:)

通过基本的核心 Tcl,我认为您相当了解您的选择。当涉及到面向表格的数据时,数组或嵌套字典都有笨重的边缘。

如果您愿意探索扩展(Tcl 就是扩展),那么您可以考虑标准 Tcl 库中的矩阵包。它将行和列作为关键概念。如果您需要对表格数据进行转换,那么我建议使用 TclRAL,这是一个关系代数库,它定义了关系数据类型,并将处理所有类型的表格数据并提供大量操作。或者,您可以尝试像 SQLite 这样的东西,它也可以处理表格数据,提供操作它并具有强大的持久存储。Tcl wiki 将引导您了解所有这些扩展的详细信息。

然而,如果这些对于您的口味来说似乎太重量级,或者如果您不想承受学习曲线的痛苦,那么卷起袖子并敲出一个数组或嵌套字典解决方案,虽然肯定是相当临时的,但可能并不那么困难。优雅的?好吧,这由你来判断。