TCL创建一个列表

时间:2017-03-09 22:47:33

标签: arrays list tcl

我是一个绝对的初学者,并不能完全围绕Tcl。我需要一些我认为非常基本的东西的帮助。任何帮助,将不胜感激。我有一个文本文件,我想导入到Tcl中。我将为您提供文件的语法和我想要的存储方式:

要导入Tcl的文本文件:

Singles 'pink granny fuji'
Singles2 'A B C D E'
Couples 'bread butter honey lemon cinnamon sugar'
Couples2 'A1 A2 B1 B2 C1 C2 D1 D2'

我想要的格式:

对于第1行和第1行2:

Singles 
[pink granny fuji] ( 3 single elements)

Singles2
[A B C D E] (5 single elements)

对于第3行和第3行4:

Couples
[bread butter
honey lemon 
cinnamon sugar] (3 x 2 array)

Couples2 
[A1 A2
B1 B2 
C1 C2
D1 D2] (4 x 2 array)

导入文本文件理论上可以包含任意数量的元素,但是第3行和第4行将始终是偶数个元素,因此它们是成对的,因此我知道每个循环都需要捕获任意数量的元素。我知道代码还需要从文本文件中删除撇号。

我现在真的很挣扎,非常感谢任何帮助,谢谢:)

2 个答案:

答案 0 :(得分:0)

这是解决方案。它完美地运作。我希望你正在寻找类似的解决方案。

   set handle [open "text_import" "r"]
   set content [read $handle]
   regsub -all {'} $content "" content
   #set content [split [read $handle] \n]
   set content [split $content \n]

   foreach ele $content {
       puts $ele
       if {[regexp -nocase -- "(\[^ \]+) +(.*)" $ele - key val]} {
           puts $key
           if {[regexp -nocase -- "single" $key]} {
               set val1 [split $val " "]
               set arr($key) $val1
           } elseif {[regexp -nocase -- "couple" $key]} {
               set biggerList [list]
               set val2 [split $val " "]
               for {set i 0} {$i < [llength $val2]} {incr i 2} {
                   set tempList [list [lindex $val2 $i] [lindex $val2 [expr $i + 1]]]
                   lappend biggerList $tempList
               }
               set arr($key) $biggerList
           }
       }
   }


   parray arr

答案 1 :(得分:0)

一种可能的解决方案。如果我们做出正确的定义,我们可以将它作为Tcl源加载,而不是将文本文件作为数据加载。

proc Singles args {
    set str [string trim [join $args] ']
    puts "\[$str]"
}

proc Singles2 args {
    set str [string trim [join $args] ']
    puts "\[$str]"
}

proc Couples args {
    set list [split [string trim [join $args] ']]
    foreach {a b} $list {
        lappend list2 "$a $b"
    }
    set str [join $list2 \n]
    puts "\[$str]"
}

proc Couples2 args {
    set list [split [string trim [join $args] ']]
    foreach {a b} $list {
        lappend list2 "$a $b"
    }
    set str [join $list2 \n]
    puts "\[$str]"
}

source textfile.txt

文档: foreachjoinlappendlistprocputssetsourcesplitstring