如何通过TCL拆分字符串并存储在列表中
有没有办法拆分字符串并保存在列表中? 如何拆分字符串并保存在两个列表中 例如,我有一个字符串,其中我用如何通过TCL拆分字符串并存储在列表中,tcl,Tcl,有没有办法拆分字符串并保存在列表中? 如何拆分字符串并保存在两个列表中 例如,我有一个字符串,其中我用=拆分了几个字符串: a=1 b=2 c=3 d=4 a=1 b=2 c=3 d=4 然后我想创建两个这样的列表[a,b,c,d]和[1,2,3,4]:一个简单的方法可能是使用循环: % set lines "a=1\nb=2\nc=3\nd=4" a=1 b=2 c=3 d=4 % set expressionList [split $lines "\n"] a=1 b=2 c=3 d=4 %
=
拆分了几个字符串:
a=1
b=2
c=3
d=4
a=1
b=2
c=3
d=4
然后我想创建两个这样的列表
[a,b,c,d]
和[1,2,3,4]
:一个简单的方法可能是使用循环:
% set lines "a=1\nb=2\nc=3\nd=4"
a=1
b=2
c=3
d=4
% set expressionList [split $lines "\n"]
a=1 b=2 c=3 d=4
% set var [list]
% set val [list]
% foreach i $expressionList {
set variable [lindex [split $i "="] 0]
set value [lindex [split $i "="] 1]
lappend val $value
lappend var $variable
}
% puts $var
a b c d
% puts $val
1 2 3 4
如果您不介意使用正则表达式,可以尝试以下方法:
% set lines "a=1\nb=2\nc=3\nd=4"
a=1
b=2
c=3
d=4
% set var [regexp -inline -lineanchor -all -- {^[^=\n\r]+} $lines]
a b c d
% set val [regexp -inline -lineanchor -all -- {[^=\n\r]+$} $lines]
1 2 3 4
假设字符串按以下顺序放置在abc.txt文件中
a=1
b=2
c=3
d=4
您需要创建两个列表,一个用于数字,一个用于字符:
set number_list [list]
set char_list [list]
set fh [open "abc.txt" "r"]
while {[gets $fh line] != -1} {
regexp -- {(\S+)=(\S+)} $line foo char number
lappend char_list $char
lappend number_list $number
}
close $fh
puts $char_list
puts $number_list
最简单的方法是读取中的所有数据,
split
为行,然后对每行使用regexp
,以提取片段
set f [open "theFile.txt"]
set lines [split [read $f] "\n"]
close $f
set keys [set values {}]
foreach line $lines {
if {[regexp {^([^=]*)=(.*)$} $line -> key value]} {
lappend keys $key
lappend values $value
} else {
# No '=' in the line!!!
}
}
# keys in $keys, values in $values
puts "keys = \[[join $keys ,]\]"
puts "values = \[[join $values ,]\]"
运行该命令(假设文件名正确),您将得到如下输出:
keys = [a,b,c,d]
values = [1,2,3,4]
这样,您就可以按名称进行查找,而不必手动搜索。假设键是唯一的,顺序也不重要。这已经很老了,但实际上我会用不同的方式来处理它。。。考虑到字符串是[a=1\nb=1\n…等]且变量名为“str”,类似于以下内容:
#确定字符串中的num条目
设置最大值[L长度$str]
#基于拆分字符串创建新字符串(alph&num)
设置i 0
set str[拆分$str\n]
设置alph[]
set num[]
而{$i<$max}{
设置alph“$alph[lindex[split[lindex$str$i]”=“]0]
设置num“$num[lindex[split[lindex$str$i]”=“]1]
增量i}
也许只是个人喜好,但对我来说似乎最简单;代码没有经过测试,但它与我刚刚研究的代码类似。如果将
$data
中的等号字符替换为空格,则始终会留下一个正确的、值相等的列表(如示例中所示),那么可以做得简单得多:
set dict [string map {= { }} $data]
set keys [dict keys $dict]
set values [dict values $dict]
文档:,下面是一个简单的tcl代码
set s "a=1\nb=2\nc=3\nd=4"
set s [split $s "\n"]
foreach e $s {
set e [split $e "="]
lappend l1 [lindex $e 0]
lappend l2 [lindex $e 1]
}
现在,列表l1中有[AB c d],l2中有[1234]a=1,b=2,c=3,d=4是一个字符串?是的,但中间没有逗号,它们都在新行中,例如新行b=2中的a=1,等等,数组中的+1。用来检查它。
set dict [string map {= { }} $data]
set keys [dict keys $dict]
set values [dict values $dict]
set s "a=1\nb=2\nc=3\nd=4"
set s [split $s "\n"]
foreach e $s {
set e [split $e "="]
lappend l1 [lindex $e 0]
lappend l2 [lindex $e 1]
}