2012-03-12 2 views
0

У меня есть следующие данные по каждому из отдельных массивов, такие как ATTEN(), мощности(), пропускная способность(), Time()массива в TCL

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 

. . . . 

Теперь мне нужно сделать ATTEN() и мощности() появляются дважды, ничего не меняя для пропускной способности массивов() и времени в Excel в формате CSV ??? .. Далее, как я пишу данные для 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) 

                 } 
+0

Какая разница между форматами? Они выглядят одинаково. – zvrba

+0

отредактировал вопрос .. В принципе мне нужно изменить массивы atten() power() на основе Time() .. Мне нужно назначить atten (i) atten (i-1) и power (i) на мощность (i -1) .. но нужно сохранить полосу пропускания() и time(). – amateur

+0

Похоже, что ваши данные - это действительно записи записей Atten, Power, Bandwidth для разных времен - это правильно? Какова текущая структура массива - какой результат вы получаете, если вы запускаете «parray Atten», «parray power» и т. Д.? –

ответ

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) 
} 

Для того, чтобы решить вашу проблему вы бы генерировать новые массивы для ATTEN и мощности с двойным элементом, как в приведенном выше примере. Затем вы создадите другие массивы, используя функцию, аналогичную приведенному выше примеру, если только они не будут возвращены при повторении через них.

Вы бы затем перебирать на другие массивы, скажем 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 Arrays (Список Hashmap)

Для получения дополнительной информации см:

+0

На самом деле мне нужно написать их, как указано @Colin Macleod, в excel, следующее: для Excel в формате CSV. \t set XlFileFormat (xlCSV) [expr 6] набор книг [$ application Workbooks] набор рабочих книг [$ workbooks Добавить] набор рабочих листов [таблица рабочих листов] таблица листов [таблица рабочих листов [expr 1] ]] набор ячеек [$ ячеек рабочего листа] \t \t \t \t \t набор строк [массив размера ATTEN] \t \t \t \t \t \t \t \t \t для {установлен ряд 1} {$ строка <= $ строк} {инкр строки} { \t \t \t \t \t \t \t \t \t \t \t $ клеток товара $ строк "А" $ ATTEN ($ строк) } – amateur

+0

Возможно, лучше добавить дополнительную информацию к вашему вопросу, а не как комментарий к моему ответу. – Appleman1234

+0

отредактировал мой вопрос ... – amateur

Смежные вопросы