TCL中的数组操作

时间:2012-03-12 18:56:36

标签: tcl

我在以下单独的数组中都有以下数据,例如:atten(),power(),bandwidth(),Time()

Atten    Power           Bandwidth      Time

30   1.52E+01   52638515      0

31   1.51E+01   49807360      10

32   1.46E+01   52848230      20

33   1.51E+01   39845888      30

我需要将排列更改为以下格式

Atten   Power           Bandwidth       Time

30  1.52E+01    52638515       0

30  1.52E+01    49807360      10

31  1.51E+01    52848230      20

31  1.51E+01    39845888      30

. . . .

现在我需要使()和power()出现两次而不更改数据带宽()和csv格式的excel中的时间???以下是我如何将数据写入excel中CSV格式。

 set application [::tcom::ref createobject "Excel.Application"]

                    set XlFileFormat(xlCSV) [expr 6]
        set workbooks [$application Workbooks]
                set workbook [$workbooks Add]
        $application DisplayAlerts False
            set worksheets [$workbook Worksheets]
        set worksheet [$worksheets Item [expr 1]]
        set cells [$worksheet Cells]
                    set rows [array size atten]
        for {set row 1} {$row <= $rows} {incr row} {

            $cells Item $row "A" $atten($row)

                                                        } 

1 个答案:

答案 0 :(得分:1)

以下代码段是如何使用按时间顺序排列的数组键列表的示例,以便按顺序打印出数组内容。然后用它来创建一个包含每个元素的数组。

#!/usr/bin/tclsh

proc add_element {array_name key value} {
upvar $array_name aa
if { ![info exists aa($key)] } {
            set aa($key) $value
            lappend aa() $key
        }
}

add_element names 1 Jane
add_element names 2 Tom
add_element names 3 Elisabeth
add_element names 4 Ted
add_element names 5 Sally


 foreach e $names() {
        add_element morenames $e $names($e)
        add_element morenames $[expr $e + 1 ] $names($e)
        }

foreach e $morenames() {
      puts $morenames($e)
}

为了解决您的问题,您将根据上面的示例使用double元素为注意和电源生成新阵列。然后,您将使用类似于上面示例的函数生成其他数组,除非它们在迭代时已经返回了有序数。

然后你会使用类似下面代码片段的东西来迭代其他数组,比如newTime:

  set rows [array size newTime]
    for {set row 1} {$row <= $rows} {incr row} {

        $cells Item $row "A" $newatten($row)
        $cells Item $row "B" $newpower($row)
        $cells Item $row "C" $newbandwidth($row)
        $cells Item $row "C" $newTime($row)
        }

以下代码段是如何重新映射TCL数组(关联数组或HashMap)的数字键的示例。

#!/usr/bin/tclsh

set names(1) Jane
set names(2) Tom
set names(3) Elisabeth
set names(4) Robert
set names(5) Julia
set names(6) Victoria

foreach n [array names names] {
 puts $n
 puts $names($n)
}
puts "-------------"

foreach n [array names names] {
    set newnames([expr $n -1]) $names($n)
}

foreach n [array names newnames] {
 puts $n
 puts $newnames($n)
}

这不足以做你想做的事。

您必须执行此操作,然后删除unset第一个元素并添加set最后一个元素。

你没有在你的问题中指明你的最后一个元素是什么。

如果您使用非数字键,例如字符串键,那么您必须为这些键提供一些顺序概念,无论是通过将它们映射到数字键还是使用其他方法。

请注意,除非您告诉他们,否则TCL数组不会在foreach循环中按顺序返回。

TCL列表更适合这种情况,如下所述。

#!/usr/bin/tclsh
set i 0
foreach j "a b c" {
puts "$j is item number $i in list x"
incr i
}

您还没有指定要转换的数据结构,或者您只是想将输入写入屏幕(使用puts)或文件。

例如,您是否要为表格生成以下任何数据结构?

  • TCL数组的TCL数组(Hashmap的Hashmap)
  • 列表清单
  • 列表的TCL数组
  • TCL阵列列表(Hashmap列表)

有关详细信息,请参阅: