统一打印多个tcl列表

Print multiple tcl lists in a uniform manner

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

例如,我使用,

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

我尝试根据本网站上的一个建议使用 "format" 但这导致了类似的输出,我想我们需要一种方法来确定最长的字符串是什么并且不能任意使用 "\t “?将不胜感激任何更好的建议。

在这种情况下,我会叫 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] 
} 

作为参考,您可以使用 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

文档:expr, lrepeat, package, report package, set, struct::matrix