Thread View: fj.lang.tcl
2 messages
2 total messages
Started by Takahide Inoue
Fri, 20 Mar 1998 00:00
[Q]うまくsplitしたいのですが
Author: 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 はここまで ---
Re: [Q]$B$&$^$/(Bsplit$B$7$?$$$N$G$9$,(B
Author: Takaaki TATEISHI
Date: Fri, 20 Mar 1998 00:00
Date: Fri, 20 Mar 1998 00:00
38 lines
1729 bytes
1729 bytes
$BN)@P$G$9!#(B
>> $B<!$N$h$&$J;v$r$7$?$$$N$G$9$,!"$I$&$7$F$b$&$^$/$G$-$^$;$s!#(B
>> $B$I$N$h$&$K$9$l$P$h$$$N$G$7$g$&$+!#$465<x$*4j$$CW$7$^$9!#(B
>> $B$A$J$_$K!"(BSolaris2.5$B$G(Btcl/tk 8.1a2 $B$r;HMQ$7$F$$$^$9!#(B
>>
>> ($B$d$j$?$$$3$H!K(B
>> $BJL%U%!%$%k!J$?$H$($P!"(Bqq.dat$B$H$7$^$9!K$K=q$+$l$?%U%!%$%k$r(B
>> $BFI$_9~$_!"O"A[G[Ns$r:n@.$9$k!#(B
($B>JN,(B)
>> $B$H$J$C$F$$$k$H!"(B
>> VAL(SEX) = "Probably
>> $B$H=P$F$-$^$9!#(B
>> $B$3$l$O!"2<$N%9%/%j%W%H$G(B "<----------$B$3$3(B"
>> $B$H$$$&0u$N$"$kItJ,$G!"(Bqq.dat$B$+$iFI$_9~$s$@0l9T$E$D$KBP$7$F!"(B
>> $B%9%Z!<%9$H!t$NJ8;z$G(Bsplit$B$7$F$$$k$+$i$G$9!#(B
>> $B%9%Z!<%9$G(Bsplit$B$9$kL\E*$O!"(B"#"$B$N:8$K$"$kJ8;z$NA0$d8e$K%9%Z!<%9(B
>> $B$,$"$C$?>l9g$K!"%9%Z!<%9$rL5;k$9$k$?$a$G$9!#(B
string trim
string trimleft
string trimright
$BJU$j$r;H$C$F$_$F$O$I$&$G$7$g$&$+!)(B
$BNc!'(B
set no_space_list {}
set str_list [split " fuge # hoge " "#"]
foreach str $str_list {
lappend no_space_list [string trim $str]
}
puts $no_space_list
--------------------------------------------------
Takaaki Tateishi [tateishi@sy.is.noda.sut.ac.jp]
[http://syyk11.is.noda.sut.ac.jp/~tateishi/]
--------------------------------------------------
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads