6

有没有办法拆分字符串并保存在列表中?如何拆分字符串并保存在两个列表中例如,我有一个字符串,我在其中拆分了几个字符串=

a=1
b=2
c=3
d=4

然后我想创建两个这样的列表[a,b,c,d][1,2,3,4]

4

6 回答 6

7

以下是一个简单的 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 和 [abcd] 和 l2 有 [1 2 3 4]

于 2019-01-17T19:51:43.793 回答
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 ,]\]"

运行它(假设文件名是正确的),你会得到如下输出:

键 = [a,b,c,d]
值 = [1,2,3,4]

收集两个这样的列表可能不是处理这些东西的最佳选择。通常,最好将其存储在数组中:

# Guarded by that [regexp] inside the foreach
set myArray($key) $value

像这样,您可以按名称进行查找,而不必手动搜索。假设键是唯一的并且顺序无关紧要。

于 2013-10-28T10:12:25.050 回答
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
于 2013-10-28T06:48:09.750 回答
2

如果用空格替换等号字符$data总是留下一个正确的偶数列表(如示例中所示),则可以更简单地完成:

set dict [string map {= { }} $data]
set keys [dict keys $dict]
set values [dict values $dict]

文档:dictsetstring

于 2014-08-18T15:51:23.287 回答
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
于 2013-10-28T07:04:09.890 回答
0

这已经很老了,但我实际上会以不同的方式处理它......类似于以下内容,考虑到字符串是 [a=1\nb=1\n ... etc.],变量名为“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}

也许只是个人喜好,但对我来说似乎最简单;代码没有经过测试,但它类似于我刚刚研究的东西。

于 2014-04-02T00:36:01.310 回答