🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: fj.lang.tcl
Article #38

[Q]うまくsplitしたいのですが

#38
From: Takahide Inoue
Date: Fri, 20 Mar 1998 00:00
94 lines
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-mail

Show 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