以TCL / PERL表格格式打印

时间:2019-06-01 19:39:16

标签: file perl tcl

我在tcl中有一个脚本,其中一个变量在每个循环中获取数据集合并追加到文件中。假设在loop1中,

$var = {xy} {ty} {po} {iu} {ii}

和在loop2

$var = {a} {b} {c} {d1} {d2} {e3}

现在在文件f.txt中转储变量。就像放$ file $ var一样。并在文件中是这样的: 第1行:{xy} {ty} {po} {iu} {ii}

第2行:{a} {b} {c} {d1} {d2}

我想最终将它们以表格格式打印在文件中。如下所示:

xy  a

ty  b

po  c

iu  d1

ii  d2

2 个答案:

答案 0 :(得分:1)

首先,读入文件并提取前两行中的单词:

set f [open "f.txt"]
set words1 [regexp -all -inline {\S+} [gets $f]]
set words2 [regexp -all -inline {\S+} [gets $f]]
close $f

此处的窍门是regexp -all -inline返回所有匹配的子字符串,而\S+选择非空白字符序列。

然后,因为我们要生成表格输出,所以需要测量第一个列表中项目的最大大小。我们最好同时测量第二个列表。

set len1 [tcl::mathfunc::max {*}[lmap w $words1 {string length $w}]]
set len2 [tcl::mathfunc::max {*}[lmap w $words2 {string length $w}]]

lmapstring length应用于每个单词,然后我们找到它们的最大值。 {*}将列表(单词长度)替换为多个参数。

现在,我们可以遍历两个列表并生成格式化的输出:

foreach w1 $words1 w2 $words2 {
    puts [format "%-*s  %-*s" $len1 $w1 $len2 $w2]
}

格式序列%-*s使用两个参数,一个是字段的长度,另一个是要放入该字段的字符串。它将值在字段内左对齐,并在右边用空格填充。没有-,它将右对齐;这对于整数更有用。您可以改用制表符来分隔字符,这通常在单词较短的情况下效果很好,但是一旦您获得更大的长度组合,效果就不太好了。


如果您要生成实际的制表符分隔的值文件,则Tcllib中的csv包将使用正确的(显而易见的!)选项来生成这些文件。

答案 1 :(得分:0)

尝试一下:

$ perl -anE 'push @{$vars[$_]}, ($F[$_] =~ s/^[{]|[}]$//gr) for 0.. $#F; END {say join "\t", @$_ for @vars}' f.txt
xy  a
ty  b
po  c
iu  d1
ii  d2