有没有办法拆分字符串并保存在列表中?
如何拆分字符串并保存在两个列表中
例如,我有一个字符串,我用=
分割了几个字符串:
a=1 b=2 c=3 d=4
然后我想要创建两个列表,例如[a,b,c,d]
和[1,2,3,4]
:
答案 0 :(得分:6)
最简单的方法是将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]
收集这样的两个列表可能不是最好的事情。通常,最好是存储在数组中:
# Guarded by that [regexp] inside the foreach
set myArray($key) $value
就像那样,您可以按名称进行查找,而不必手动搜索。假设密钥是唯一的,订单并不重要。
答案 1 :(得分:3)
一种简单的方法可能是使用循环:
% 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
答案 2 :(得分:3)
以下是一个简单的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的[a b c d]和l2的[1 2 3 4]
答案 3 :(得分:2)
如果用空格替换$data
中的等号字符总是留下一个正确的,偶数值列表(如示例中所示),那么可以更简单地完成它:
set dict [string map {= { }} $data]
set keys [dict keys $dict]
set values [dict values $dict]
答案 4 :(得分:1)
请按照以下顺序将您的字符串放在文件abc.txt中
a=1
b=2
c=3
d=4
您需要创建2个列表,一个用于数字,一个用于字符:
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
答案 5 :(得分:0)
这是相当古老的,但我实际上会采用不同的方式......考虑到字符串是[a = 1 \ nb = 1 \ n ...等等],变量名称为&# 34; STR":
# determine num entries in string
set max [llength $str]
#create new strings (alph & num) based on split string
set i 0
set str [split $str \n]
set alph []
set num []
while {$i < $max} {
set alph "$alph [lindex [split [lindex $str $i] "="] 0]
set num "$num [lindex [split [lindex $str $i] "="] 1]
incr i}
也许只是个人偏好,但对我来说似乎最简单;代码没有经过测试,但它与我刚刚开展的工作类似。