6

文字列を分割してリストに保存する方法はありますか? 文字列を分割して 2 つのリストに保存する方法 たとえば、次のようにいくつかの文字列を分割した文字列があります=

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

そして、次のような2つのリストを作成したいと思い[a,b,c,d]ます[1,2,3,4]:

4

6 に答える 6

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]

そのような 2 つのリストを収集することは、そのようなものを扱うのに最適なことではないかもしれません。多くの場合、代わりに配列に格納する方が適切です。

# 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 に答える