2017-03-09 76 views
0

我是一个绝对的初学者,不能完全包围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 & 2:

Singles 
[pink granny fuji] (3 single elements) 

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

对于线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) 

导入文本文件在理论上可以有任意数量的元素,但行总是偶数个元素,因此它们是对,所以我知道每个循环都需要捕获任意数量的元素。我知道代码还需要从文本文件中去掉撇号。

我的那一刻真的很挣扎,非常感谢所有帮助都,谢谢:)

+0

只需要知道你所知道的。你知道tcl中的列表是什么吗?你知道关于foreach吗?你熟悉正则表达式吗? – slebetman

+0

我的第一个澄清问题:代码应该如何决定使用第一种还是第二种输出格式?这是因为前面的字符串“Single”还是前面的字符串“Couple”,还是因为数字指数是通过输入数据计数的? –

+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 

+0

非常感谢您的帮助!你的代码和语法帮助我编写代码,最后我使用readFile,字符串匹配,范围和修剪来完成它。我甚至不需要正则表达式,因为我的输入文件非常简单,但真的很高兴看到该示例,并且我知道下次如何使用正则表达式。谢谢堆:) –

+0

伟大的,它已经帮助你。不要忘记+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

+0

非常感谢您的帮助!这个想法绝对帮助了我,最后我用readFile,字符串匹配,范围和修剪来做到这一点。再次感谢 :) –