我是一个绝对的初学者,并不能完全围绕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行将始终是偶数个元素,因此它们是成对的,因此我知道每个循环都需要捕获任意数量的元素。我知道代码还需要从文本文件中删除撇号。
我现在真的很挣扎,非常感谢任何帮助,谢谢:)
答案 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
文档: foreach, join, lappend, list, proc, puts, set, source, split, string