Как печатать в табличном формате в tcl? - PullRequest
7 голосов
/ 13 июля 2011

Я пытаюсь распечатать данные в табличном формате в tcl. Предположим, у меня есть три массива: -

GOLD, TEST, DIFF и в нем есть некоторые значения. Я хочу получить в печатном виде в следующем формате: -

ЗОЛОТО ТЕСТ ДИФФ
----------- -------- ---------
1 Привет Привет
2 стека Формат
3 парня за
Печать 4 TCL

Не могли бы вы, ребята, предложить что-нибудь?

Ответы [ 4 ]

15 голосов
/ 13 июля 2011

Я бы использовал команду 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
4 голосов
/ 13 июля 2011

Сначала преобразуйте массивы в списки:

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
3 голосов
/ 13 июля 2011

Вот код, который делает то, что вы хотите с помощью одного цикла 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"
}
2 голосов
/ 13 июля 2011

Еще одним сложным вариантом было бы использовать пакет report от tcllib.

Но это, вероятно, не стоит этого простого случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...