TCL中的数组操作

TCL中的数组操作,tcl,Tcl,我在单独的数组中分别有以下数据,如atten()、power()、bandwidth()、Time() 我需要将安排更改为以下格式 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 .

我在单独的数组中分别有以下数据,如atten()、power()、bandwidth()、Time()

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

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

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

 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)

                                                        } 
设置应用程序[::tcom::ref createobject“Excel.application”]
设置XlFileFormat(xlCSV)[expr 6]
设置工作簿[$应用程序工作簿]
设置工作簿[$workbooks Add]
$application DisplayAlerts False
设置工作表[$工作簿工作表]
设置工作表[$worksheets项[expr 1]]
设置单元格[$工作表单元格]
设置行[数组大小atten]

对于{set row 1}{$row来说,下面的代码片段是如何使用按时间顺序排列的数组键列表,以便按顺序打印数组内容的示例。然后使用该代码段生成一个数组,每个元素中有两个

#!/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)
}
为了解决您的问题,您将按照上面的示例为ATEN和power生成具有双元素的新数组。然后,您将使用类似于上面示例的函数生成其他数组,除非在遍历它们时已按顺序返回

然后,您将使用类似于以下代码段的内容,在其他数组(如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)
        }
这不足以做你想做的事

您必须执行此操作,然后删除
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
}
您还没有指定要转换为什么数据结构,或者只是想将输入写入屏幕(使用
put
)还是文件

例如,您是否希望为您的表生成以下任何数据结构

  • TCL数组的TCL数组(Hashmap的Hashmap)
  • 名单
  • TCL列表数组
  • TCL数组列表(Hashmap列表)
有关更多信息,请参阅:


两种格式之间有什么区别?它们看起来相同。编辑了问题。基本上,我需要根据时间()更改数组atten()power()…我需要将atten(i)分配给atten(i-1),将power(i)分配给power(i-1)…但需要保留带宽()和时间()…听起来你的数据实际上是不同时间的Atten、功率和带宽记录-对吗?当前的阵列结构是什么-如果你运行
parray Atten
parray Power
,等等,你会得到什么输出?是的。不同时间的Atten、功率和带宽..我有Atten()、功率()、带宽()、时间()每个数组都是独立的。源数据看起来像我在问题中提到的第一组…请再次检查问题,我已经编辑了它。仍然不清楚的是数组的键值是什么。你知道Tcl数组可以键入任何字符串值吗?你是否像使用C数组一样使用整数键?听起来像e对于表中的ATEN和Power列,您希望每个值显示两次,而其他列保持不变-是吗?实际上,我需要将@Colin Macleod指定的值写入excel,下面我显示我以CSV格式写入excel..设置XlFileFormat(xlCSV)[expr 6]设置工作簿[$application workbook]设置工作簿[$workbook Add]设置工作表[$workbook worksheets]设置工作表[$worksheets Item[expr 1]]设置单元格[$worksheet cells]为{设置行1}设置行[array size atten]{$row在您的问题中添加额外的信息可能比在我的答案中添加注释更好。
#!/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)
}
#!/usr/bin/tclsh
set i 0
foreach j "a b c" {
puts "$j is item number $i in list x"
incr i
}