首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCL/TK --如何优化多输入过程

TCL/TK --如何优化多输入过程
EN

Stack Overflow用户
提问于 2015-04-21 11:03:00
回答 2查看 97关注 0票数 1

我试图优化一个输入大约200个不同值的过程;出于这些原因,我想使它尽可能标准化。proc应该将值(24列,按固定长度分开)保存在输出txt文件中,如下所示:

代码语言:javascript
复制
NAME                  Pipe1           Pipe2      ...      Pipe24
INITIAL_NUMBER        100000          106500     ...      208000
Prop1                 301             303        ...      325
Prop2                 302             304        ...      326

到目前为止,我的过程在input 中声明了所有不同的变量。下面是前两列的示例。

代码语言:javascript
复制
CreateText  $MTCollector1 $MTCollector2 $MTNumGas1 $MTNumGas2 $MTPconvGas1 $MTPconvGas2 $MTMatGas1 $MTMatGas2 }

proc CreateText { MTCollector1 MTCollector2 MTNumGas1 MTNumGas2 MTPconvGas1 MTPconvGas2 MTMatGas1 MTMatGas2} {

 set OutputTable    [open "Output.txt" w]
 puts $OutputTable "[ format "%-16s" NAME]                [ format "%-16s" $MTCollector1][ format "%-16s" $MTCollector2]"
 puts $OutputTable "[ format "%-16s" INITIAL_NUMBER]                [ format "%-16s" $MTNumGas1][ format "%-16s" $MTNumGas2]"
 puts $OutputTable "[ format "%-16s" Prop1]                [ format "%-16s" $MTPconvGas1][ format "%-16s" $MTPconvGas2]"
 puts $OutputTable "[ format "%-16s" Prop2]                [ format "%-16s" $MTMatGas1][ format "%-16s" $MTMatGas2]"
             }

不管怎么说,在不声明所有变量的情况下,是否会提高它的效率?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-21 13:49:57

您可以使用变量名来完成此操作。您的变量名显然是由变量前缀和列号连接而形成的。

这个例子是经过测试的,这里限制为2列,但没有限制。

代码语言:javascript
复制
# Assuming that vars $MTCollector1, $MTCollector2, etc are set

set MTCollector1 Pipe1
set MTCollector2 Pipe2
set MTNumGas1 100000
set MTNumGas2 106500
set MTPconvGas1 301
set MTPconvGas2 303
set MTMatGas1 302
set MTMatGas2 304

set listVars [list MTCollector MTNumGas MTPconvGas MTMatGas]
set listNames [list NAME INITIAL_NUMBER Prop1 Prop2]
set colNumber 2


proc CreateText { listVars listNames colNumber } {

    set OutputTable    [open "Output.txt" w]

    set nbvars [llength $listVars]
    for { set i 0 } { $i < $nbvars } { incr i } {

        puts -nonewline $OutputTable [ format "%-16s" [lindex $listNames $i]] 
        for { set j 1 } { $j <= $colNumber } { incr j } {

            set varprefix [lindex $listVars $i]
            set varname [set varprefix][set j]
            upvar 1 $varname var
            puts -nonewline $OutputTable [format "%-16s" $var]
        }
        puts $OutputTable "" 

    }
    close $OutputTable
}

我确信其他tcler可以构建一些更地道的东西,但它似乎可以作为您的示例。

票数 1
EN

Stack Overflow用户

发布于 2015-04-21 14:44:37

正如Johannes评论的那样,将数据存储在字典中会导致非常干净的代码:

代码语言:javascript
复制
proc main {} {
    set data [dict create]
    # however you generate your data, add it to the dictionary
    dict lappend data NAME           Pipe1   Pipe2  ... Pipe24
    dict lappend data INITIAL_NUMBER 100000  106500 ... 208000
    dict lappend data Prop1          301     303    ... 325
    dict lappend data Prop2          302     304    ... 326

    CreateText $data
}

proc CreateText {data} {
    set fid stdout                 ;# test with  stdout instead of a file
    dict for {key values} $data {
        puts -nonewline $fid [format "%-32s" $key]
        foreach value $values {
            puts -nonewline $fid [format "%-16s" $value]
        }
        puts $fid ""
    }
    close $fid
}

main
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29770380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档