以统一的方式打印多个tcl列表

时间:2016-02-11 18:30:38

标签: tcl

我有一组列表,其中一些包含字符串,一些包含数字,一些包含两者。所有这些列表都有可变长度。我想知道将它打印到文件的最佳方法是什么,以便它们之间的间距相等。

例如,我用,

set numbers {0 1 2 3 4}
set type {dog reallybigbaddog thisisaevenlargersentence cat bird}
set paths {aaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccc ddddddddddddddddd  efgh}
puts $fid "NUMBERS\t\tTYPE\tPATHS"
foreach numbersval $numbers typeval $type  pathsval $paths  {
    puts $fid "$numbersval\t\t$typeval\t$pathsval"
}

结果是,

NUMBERS      TYPE                         PATHS
0            dog       AAA
1            reallybigbaddog       bbbbbbbbbbbbbbbbbbbbbbbb
2            thisisaevenlargersentence       ccc 
3            cat       ddddddddddddddddd
4            bird       efgh

我尝试使用“格式”基于本网站上的一个建议但产生了类似的输出,我想我们需要一种方法来确定最长的字符串是什么,并且不能随意使用“\ t”?非常感谢任何更好的建议。

2 个答案:

答案 0 :(得分:2)

供参考,您可以使用struct::matrixreport来完成此操作:

package require struct::matrix
package require report

set nrows 5
set ncols 3
set npads [expr {$ncols + 1}]

struct::matrix m
m add rows $nrows
m add column {0 1 2 3 4}
m add column {dog reallybigbaddog thisisaevenlargersentence cat bird}
m add column {aaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccc ddddddddddddddddd  efgh}
m insert row 0 {NUMBERS TYPE PATHS}

report::report r $ncols
r data set [lrepeat $npads \t]
m format 2string r

(这只使用report的格式化功能的一小部分。)此方法可以处理包含空格的值。

结果(每行的第一列左侧有一个制表符,但在格式化中丢失了。):

NUMBERS TYPE                        PATHS                               
0       dog                         aaa                                 
1       reallybigbaddog             bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb    
2       thisisaevenlargersentence   ccc                                 
3       cat                         ddddddddddddddddd                   
4       bird                        efgh

文档:exprlrepeatpackagereport包,setstruct::matrix

答案 1 :(得分:1)

在这种情况下,我会致电column -t为我做这项工作:

set all "NUMBERS TYPE PATHS\n"
foreach n $numbers t $type p $paths {
    append all "$n $t $p\n"
}
set formatted [exec column -t << $all]
puts $formatted
NUMBERS  TYPE                       PATHS
0        dog                        aaa
1        reallybigbaddog            bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
2        thisisaevenlargersentence  ccc
3        cat                        ddddddddddddddddd
4        bird                       efgh

纯粹的Tcl方法:

array set maxl {numbers 0 type 0 paths 0}
foreach l {numbers type paths} {
    foreach e [concat $l [set $l]] {
        if {[set len [string length $e]] > $maxl($l)} {
            set maxl($l) $len
        } 
    } 
} 
puts [format "%-*s %-*s %-*s" $maxl(numbers) NUMBERS $maxl(type) TYPE $maxl(paths) "PATH LISTS"]
foreach n $numbers t $type p $paths {
    puts [format "%-*s %-*s %-*s" $maxl(numbers) $n $maxl(type) $t $maxl(paths) $p] 
}