Tcl中如何按键值排序以列格式打印多个数组内容
Tcl实现同键范围数组按键值排序列形式输出
需求说明
存在多个键取值范围完全一致的数组,例如binA($i)、binB($i)、binC($i),其中i取值范围为1-100,需要按键值排序后,将各数组对应键的内容按列打印,期望输出格式如下:
Expected output: i A B C 1 binA(1) binB(1) binC(1) 2 binA(2) binB(2) binC(2) 3 binA(3) binB(3) binC(3) .... 100 binA(100) binB(100) binC(100)
实现思路
- 统一维护待输出的数组与列名的映射关系,方便后续扩展列数
- 提取数组公共键,按对应类型排序(数字键用数值排序避免字典序错乱)
- 用格式化输出保证列对齐,先输出表头再逐行拼接每个键对应的各数组值输出
可运行示例代码
# -------------------------- # 以下为测试数据,实际使用时替换为自身业务的数组即可 for {set i 1} {$i <= 100} {incr i} { set binA($i) "dataA_$i" set binB($i) "dataB_$i" set binC($i) "dataC_$i" } # -------------------------- # 配置输出规则:键为列名,值为对应数组名,顺序即输出列的顺序 set colMap { A binA B binB C binC } # 提取公共键并按数值升序排序(因为键范围一致,取第一个数组的键即可) set firstArr [lindex $colMap 0 1] set sortedKeys [lsort -integer [array names $firstArr]] # 输出表头 set header [list i] lappend header {*}[dict keys $colMap] puts [format "%-5s %-12s %-12s %-12s" {*}$header] # 逐行输出每个键对应的各数组值 foreach k $sortedKeys { set line [list $k] dict for {col arrName} $colMap { # 引用数组变量,跨作用域也能正常取值 upvar 0 $arrName targetArr lappend line $targetArr($k) } puts [format "%-5d %-12s %-12s %-12s" {*}$line] }
调整说明
- 若需要增减输出列,仅需修改
colMap中的列名、数组名映射即可,核心逻辑无需改动 format语句中的宽度参数(如%-5s、%-12s)可根据实际内容长度调整,负号代表内容左对齐,可保证列不会错位- 若键为非数字类型,将
lsort的-integer参数移除,使用默认字典序排序即可
内容的提问来源于stack exchange,提问作者zerodb
相关产品推荐
相关产品推荐

