0

以下のように、動的な行と動的な列を含むレポートを印刷する必要があります。

            apple                           bannana                  pineapple
    Total           47              Total           376             Total 210
    a       :       3               i       :       10              m       : 45
    b       :       4               j       :       33              o       : 67
    c       :       18              k       :       245             n       : 98
    d       :       22              l       :       45
                                    x       :       43

すべてのリストの長さを取得し、リストの最大の長さで for ループを繰り返すことを考えました。上記の例では 5 回です。

私の疑問は、「forループ」から取得した番号を使用して、リスト内の特定のペアをどのように出力できるかです。

たとえば、最初の反復では、すべての果物の最初の項目を選択して出力する必要があります。fruit_${type}[1] のようなものかもしれません。どうすればいいのかわからない。お知らせ下さい。

    #!/bin/sh
    # \
    exec tclsh "$0" "$@"
    set fruit_apple {{a 3} {b 4} {c 18} {d 22}}
    set fruit_bannana {{i 10} {j 33} {k 245} {l 45} {x 43}}
    set fruit_pineapple {{m 45} {o 67} {n 98}}
    set fruit {apple bannana pineapple}
    puts $fruit_apple
    foreach type $fruit {
    puts $type
            foreach pair [set fruit_${type}] {
                    set key [lindex $pair 0]
                    set value [lindex $pair 1]
                    puts "$key : $value"
            }
    }
4

1 に答える 1

2

次のようにレポートを垂直にフォーマットするには、多くの作業を行う必要があります。

#! /usr/bin/env tclsh
set fruit_apple {{a 3} {b 4} {c 18} {d 22}}
set fruit_bannana {{i 10} {j 33} {k 245} {l 45} {x 43}}
set fruit_pineapple {{m 45} {o 67} {n 98}}
set fruit {apple bannana pineapple}
set maxl [expr {max([llength $fruit_apple], [llength $fruit_bannana], [llength $fruit_pineapple])}]

set fmt "%s\t%s\t%s\t"
foreach type $fruit {
    puts -nonewline [format $fmt "" $type ""]
    set total($type) 0
    foreach pair [set fruit_${type}] {
        lassign $pair key value
        incr total($type) $value
    }
}
puts ""
foreach type $fruit {
    puts -nonewline [format $fmt Total "" $total($type)]
}
puts ""
for {set i 0} {$i < $maxl} {incr i} {
    foreach type $fruit {
        set pair [lindex [set fruit_$type] $i]
        if {[llength $pair] == 2} {
            puts -nonewline [format $fmt [lindex $pair 0] : [lindex $pair 0]]
        } else {
            puts -nonewline [format $fmt "" "" ""]
        }
    }
    puts ""
}

出力:

        apple                   bannana                 pineapple               
Total           47      Total           376     Total           210     
a       :       3       i       :       10      m       :       45      
b       :       4       j       :       33      o       :       67      
c       :       18      k       :       245     n       :       98      
d       :       22      l       :       45                              
                        x       :       43                              

データをより良いデータ構造に変換するのは、わずかに簡単です。ここで、配列を使用します。

#! /usr/bin/env tclsh
set fruit_apple {{a 3} {b 4} {c 18} {d 22}}
set fruit_bannana {{i 10} {j 33} {k 245} {l 45} {x 43}}
set fruit_pineapple {{m 45} {o 67} {n 98}}
set fruit {apple bannana pineapple}

array set keys {}
array set values {}
array set total {}
set maxl 0
foreach type $fruit {
    set l [set fruit_$type]
    if {[llength $l] > $maxl} {set maxl [llength $l]}
    set total($type) 0
    foreach pair $l {
        lassign $pair key value
        lappend keys($type) $key
        lappend values($type) $value
        incr total($type) $value
    }
}

set fmt "%s\t%s\t%s\t"
foreach type $fruit {
    puts -nonewline [format $fmt "" $type ""]
}
puts ""
foreach type $fruit {
    puts -nonewline [format $fmt Total "" $total($type)]
}
puts ""
for {set i 0} {$i < $maxl} {incr i} {
    foreach type $fruit {
        if {$i < [llength $keys($type)]} {
            puts -nonewline [format $fmt [lindex $keys($type) $i] : [lindex $values($type) $i]]
        } else {
            puts -nonewline [format $fmt "" "" ""]
        }
    }
    puts ""
}
于 2013-01-21T12:37:37.423 に答える