Article View: fj.lang.tcl
Article #38[Q]うまくsplitしたいのですが
From: Takahide Inoue
Date: Fri, 20 Mar 1998 00:00
Date: Fri, 20 Mar 1998 00:00
94 lines
3500 bytes
3500 bytes
富士ゼロックスの井上と申します。
皆様のお知恵を拝借したく投稿いたしました。
(FAQの場合はご容赦ください)
次のような事をしたいのですが、どうしてもうまくできません。
どのようにすればよいのでしょうか。ご教授お願い致します。
ちなみに、Solaris2.5でtcl/tk 8.1a2 を使用しています。
(やりたいこと)
別ファイル(たとえば、qq.datとします)に書かれたファイルを
読み込み、連想配列を作成する。
qq.datの中身が例えば次の3行であったとします。
NAME # Inoue
AGE #30
SEX# MALE
この様なファイルを読み込んで、ファイル中で、"#"の左にある
文字を添字にし(但し、スペースを除く)、"#"の右にある
文字を値(但し、スペースを除く)とする連想配列VALを作成したいと
思い、下の様なtcl スクリプト(test.tclとする)を作成しました。
% test.tcl qq.dat と実行すると、
VAL(NAME) = (Inoue)
VAL(AGE) = (30)
VAL(SEX) = (MALE)
と出力されるので、望みのtclスクリプトが作成できたと思っていました。
しかし、下記のスクリプトでは、”#”の右側にスペースを含む文字が
ある場合にはうまくいきません。
例えば、qq.dat内のSEXの部分が、
SEX# "Probably MALE"
となっていると、
VAL(SEX) = "Probably
と出てきます。
これは、下のスクリプトで "<----------ここ"
という印のある部分で、qq.datから読み込んだ一行づつに対して、
スペースと#の文字でsplitしているからです。
スペースでsplitする目的は、"#"の左にある文字の前や後にスペース
があった場合に、スペースを無視するためです。
データファイル(qq.dat)でスペースを含む文字の与え方を工夫したり、
(例えば、
SEX# {Probably MALE}
SEX# "{Probably MALE}" としたりする)
下のスクリプトを変更したりして、
VAL(SEX) = (Probably MALE)
と求まるようにしたいのですが、どのようにすればよいでしょうか。
よろしくお願いします。
--- test.tcl は ここから ---
#! /usr/local/bin/tclsh8.1
set want_ele { NAME AGE SEX }
set want_cnt [llength $want_ele]
set id [open [lindex $argv 0] r]
while {![eof $id]} {
gets $id line
set list [split $line "\ #"] ;# <----------ここ
set cnt [llength $list]
#--- 上で求めたlistは空白文字を含むので ---#
#--- それを排除する ---#
for {set j 0} {$j<$cnt} {incr j} {
set val [lindex $list $j]
if {$val==""} {
set list [lreplace $list $j $j]
incr j -1
incr cnt -1
}
}
#--- ---#
set ele [lindex $list 0]
set val [lindex $list 1]
#--- 配列VALに値を設定する ---#
set VAL($ele) $val
}
#--- 配列VALの値の書き出し ---#
for {set i 0} {$i<$want_cnt} {incr i} {
set ele [lindex $want_ele $i]
puts "VAL($ele) = ($VAL($ele))"
}
--- test.tcl はここまで ---
Technical Details
Message-ID:
<3511C13F.3662300D@rim.crl.fujixerox.co.jp>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: Japanese,JIS X-Google-Thread: 15a83d,88f91382f0f7b6a1,start X-Google-Attributes: gid15a83d,public From: Takahide Inoue <inoue@rim.crl.fujixerox.co.jp> Subject: [Q]うまくsplitしたいのですが Date: 1998/03/20 Message-ID: <3511C13F.3662300D@rim.crl.fujixerox.co.jp> X-Deja-AN: 335778550 Content-Transfer-Encoding: 7bit Mime-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp Organization: Fuji Xerox Co., Ltd., Kanagawa, Japan Newsgroups: fj.lang.tcl