このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

set xxx to count items of zzzの使用で・・・

発言者:Shinji Hoashi
( Date Tuesday, February 04, 1997 13:05:01 )


はじめて書き込みます。
済みませんが、AppleScriptでどうしても
思うような結果が帰ってこないので、
教えてほしいのです。

やりたいことは、以下のようなことが
書かれているテキストファイルを読み出し、
項目毎に取り出して、別のテキストから、検索して
削除したいのです。

5303,zhaly
3939,kmzwhisa
4560,ja6ktd
4984,miyeno
4181,andoh

この場合、まずファイルを指定した後読み込んで、
return毎に何項目あるか数え、
1行目の項目をさらに","で分けて、
別テキスト内を、例えばここでは"5303"と
"zhaly"で検索後見つかったら削除するように考えています。

ですが、最初の方ですでにひっかかってしまって、、、

  tell application "Finder"
    set doList to choose file {}
    set readFile to readFromFile (doList)    ---A
    
    set rf to xReplace readFile search return replace ":"
    
    set oldDel to AppleScript's text item delimiters
    set AppleScript's text item delimiters to {":"}    ---B
    set cList to count items of rf
    set AppleScript's text item delimiters to oldDel
    display dialog (cList)

込み入ったことをしていますが、最初はBの部分で

set AppleScript's text item delimiters to {return}

を指定して、次の行でアイテム数を数えてたんですが、
ここで、60と言う数字が帰ってきました。
そこで、今度はうえのようにreturnを":"に変えて
再び数えたのですが、やはり60が帰ってきます。

文字数を変えたりしてみると、数字も増減しますので、
これはどうも文字数(かbyt数)が帰ってきてるようなのですが、
どうしてこの数字が帰ってくるのでしょう?

他のプログラムを参照しても、間違っていないようですが・・・
それとも間違っていますか?

どうか教えて下さい。。。


smart さんからのコメント
( Tuesday, February 04, 1997 13:38:51 )

Shinji Hoashiさん

Bの次に
  set rf to text items of rf
を追加して、rfをlistにすれば良いと思います。

狩野正嗣 さんからのコメント
( Tuesday, February 04, 1997 14:46:34 )

 まず、デリミタをreturnにして、

set rf to text items of rf

 とし、次にrfの各項目についてデリミタを","にして

repeat with i from 1 to (count items of rf)
  set item i of rf to text items of item i of rf
end repeat

 とすれば

{{"5303", "zhaly"}, {"3939", "kmzwhisa"}, {"4560", "ja6ktd"}
, {"4984", "miyeno"}, {"4181", "andoh"}}

 というリストが得られますが… あまり関係ないかもしれませんけど (^ ^;)

田中求之 さんからのコメント
( Tuesday, February 04, 1997 19:38:38 )

すでにコメントが付いていますが、text item delimiters を使って行数を数える
場合は、 count text items で数えます。 count items ではありません。
             ^^^^^

ですから、読み込んだファイルの行数を数える場合は、

set myFile to choose file
set myData to readFromFile myFile
set oldDel to AppleScript's text item delimiters
set AppleScript's text item delimiters to {return}

set dx to count text items of myData

こうすると、myData に読み込んだデータの行数を数えることになります。


ただ、Hoashi さんのなさりたい処理から考えると、smart さんのコメントの
ように、読み込んだデータを行単位で切り分けたリストに変換して、その
リストをループ処理していくのがよいでしょうね。

なお、単純にファイルを読み込んで処理するだけであれば、Finder を呼び出す
必要はありませんよ。

Shinji Hoashi さんからのコメント
( Wednesday, February 05, 1997 12:53:25 )

smartさん、狩野さん、田中さんご教授ありがとうございます。
返事が遅れてごめんなさい。

そうか、set rf to text items of rfがたりなかったんですね。
これで正常に動作するようになりました。ありがとうございます。

済みません。後一つ教えて下さい。
指定したファイルを読み込んだあと、display dialogで確認すると

5303,zhaly
3939,kmzwhisa
4560,ja6ktd
4984,miyeno
4181,andoh

と入ってて、

set rf to text items of rfのあとまた確認すると

5303,zhaly
3939,kmzwhisa
4560,ja6ktd
4984,miyeno
4181,andoh

なんですが、smartさんは、listにすればいいということなんですが、
これは、returnで区切られたレコードのlistと解釈するんですよね?

また、

    repeat with i from 1 to (count items of rf)
      set item i of rf to text items of item i of rf
      display dialog (rf as text)
    end repeat

で確認すると、dialogでは、
5303,zhaly,3939,kmzwhisa,4560,ja6ktd,4984,miyeno,4181,andoh
という風に表示されますが、
本当は、{{"5303", "zhaly"}, {"3939", "kmzwhisa"}, {"4560", "ja6ktd"}
, {"4984", "miyeno"}, {"4181", "andoh"}}と言う風に考えればいいのですよね?

どうして、このことを聞くかというと、AppleScriptをはじめて、
まだ日が浅いので一つ一つ確認しながらやってるんですが、
この表示の仕方がわるいのか、惑わされてしまいます。
(それとも他に良い確認方法があるのでしょうか?)

みなさんはどういう風に確認されてますか?

Shinji Hoashi さんからのコメント
( Wednesday, February 05, 1997 13:16:44 )

自己フォローになってしまいますが・・・

>これは、returnで区切られたレコードのlistと解釈するんですよね?

田中さんが行単位の切り分けたリストと書いてました。
ごめんなさい見落としでした。

あとは、1行づつ取り出して検索かければ良いわけですね。


田中求之 さんからのコメント
( Wednesday, February 05, 1997 13:18:49 )

Display dialog を使うと、データは文字列に変換されてから表示されますので、
リストを表示させた場合、{} は表示されません。 

リストの様子などを確認したいのであれば、Log (履歴)を表示させておいて、
「結果を表示」をチェックしておくと、実行中のデータの処理の記録を見ることが
できますので、簡単なデバッグであればこれだけでなんとかなります。

狩野正嗣 さんからのコメント
( Wednesday, February 05, 1997 17:47:52 )

 そうですね、「履歴」を使うのが一番良いと思います。

 非常に小さなスクリプトの結果が知りたいだけなら、スク
リプトの最後に変数をそのまま書いておけば、「結果」ウィ
ンドウにその変数の最終的な値が表示されます。

 たとえば

    repeat with i from 1 to (count items of rf)
      set item i of rf to text items of item i of rf
    end repeat
    rf
    
 とすれば「rf」の値を知ることができます。