如何在tcl中以表格格式打印?

时间:2011-07-13 09:05:31

标签: format tcl

我正在尝试在tcl中以表格格式打印数据。假设我有三个数组: -

GOLD, TEST, DIFF并且它有一些值。我想以下列格式打印: -

  

GOLD TEST DIFF
  ----------- -------- ---------
  1你好你好
  2堆栈格式
  3个家伙
  4 TCL打印

你们想建议吗?

4 个答案:

答案 0 :(得分:15)

我会使用format命令结合foreach来完成您的要求。我假设你实际上有3个列表,而不是3个数组,因为看起来gold,test,diff的值在某种程度上彼此相关。

set goldList {1 2 3 4}
set testList {Hello Stack Guys TCL}
set diffList {Hi Format for print}

set formatStr {%15s%15s%15s}
puts [format $formatStr "GOLD" "TEST" "DIFF"]
puts [format $formatStr "----" "----" "----"]
foreach goldValue $goldList testValue $testList diffValue $diffList {
    puts [format $formatStr $goldValue $testValue $diffValue]
}

# output
       GOLD           TEST           DIFF
       ----           ----           ----
          1          Hello             Hi
          2          Stack         Format
          3           Guys            for
          4            TCL          print

答案 1 :(得分:4)

首先将数组转换为列表:

set GOLDList ""
set keyList [array names GOLD]
foreach key $keyList {
    lappend GOLDList $GOLD($key)
}

然后你可以使用foreach片段:

set GOLDList "1 2 3 4"; #1st list
set TESTList "Hello Stack Guys TCL"; #2nd list
set DIFFList "Hi Format for print"; #3rd list

foreach c1 $GOLDList c2 $TESTList c3 $DIFFList {
    puts $c1\t$c2\t$c3
}

这是输出(你需要额外打印标题)

1   Hello   Hi
2   Stack   Format
3   Guys    for
4   TCL     print

答案 2 :(得分:3)

这是使用单个foreach循环执行所需操作的代码。没有必要创建临时列表 - 假设您有阵列的公共索引(您没有指定)。

array set GOLD {a 1 b 2 c 3 d 4}
array set TEST {d TCL c Guys b Stack a Hello}
array set DIFF {a Hi c for b Format d print}
foreach idx [lsort [array names GOLD]] {
  puts "$GOLD($idx)\t$TEST($idx)\t$DIFF($idx)"
}

如果您没有数组的公共索引(那么我想知道打印表的实用程序),您可以这样做(虽然相对排序是未定义的):

foreach {gidx gval} [array get GOLD] {tidx tval} [array get TEST] {didx dval} [array get DIFF] {
  puts "$gval\t$tval\t$dval"
}

答案 3 :(得分:2)

另一个复杂的选择是使用tcllib的report包。

但对于这个简单的案例,这可能不值得。