我正在尝试在tcl中以表格格式打印数据。假设我有三个数组: -
GOLD, TEST, DIFF
并且它有一些值。我想以下列格式打印: -
GOLD TEST DIFF
----------- -------- ---------
1你好你好
2堆栈格式
3个家伙
4 TCL打印
你们想建议吗?
答案 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包。
但对于这个简单的案例,这可能不值得。