初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2022-08-22 17:24:42

koko009
Guest

Loop処理にifを使っているスクリプトをwhile()に書き換えたい

いつもお世話になっております。下記のような改行リストから任意のテキストを含む行を抽出するloop処理スクリプトをwhile()の式にする方法をお教えください。
元リスト
温州みかん
リンゴ
みかんみかんりんご
みかん
バナナ
かき
夏みかん

抽出結果
温州みかん
みかんみかんりんご
みかん
夏みかん

loop処理スクリプト
    変数を設定 [ $cnt; 値:1 ]
    変数を設定 [ $res; 値:"" ]
    Loop
    Exit Loop If [ $cnt > ValueCount ( List::list ) ]
    If [ PatternCount (GetValue ( List::list; $cnt ) ; "みかん") > 0 ]
    変数を設定 [ $res; 値:$res & GetValue ( List::list; $cnt ) & ¶ ]
    End If
    変数を設定 [ $cnt; 値: $cnt + 1 ]
    End Loop
    フィールド設定 [ List::f1; $res ]
caseを使い単純繰り返しで空行を含んだ結果になる式は作れるのですが、while()でif式の部分をどう組み込むか分かりません。
ご教授お願いいたします。
当方の環境:win10、FM19.5.2.201

#2 2022-08-22 17:51:50

Shin
Member

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

While (
[
    T0 = 元リスト ;
    Tar = "みかん" ;
    n = ValueCount ( T0 ) ;
    T1 = ""
] ;
    n
[
    Tn = GetValue ( T0 ; n ) ;
    T1 = Case ( PatterCount ( Tn ; Tar ) ; List ( Tn ; T1 ) ; T1 ) ;
    n = m - 1
] ;
    T1
)
手打ちしているので、Typo あるかも

Offline

#3 2022-08-22 18:18:14

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

少しタイプミスを手直しし下記の式で結果を得られました。
While (
[
    T0 = List::list ;
    Tar = "みかん" ;
    n = ValueCount ( T0 ) ;
    T1 = ""
] ;
    n ≥ 1;
[
    Tn = GetValue ( T0 ; n ) ;
    T1 = Case ( PatternCount ( Tn ; Tar ) ; List ( Tn ; T1 ) ; T1 ) ;
    n = n - 1
] ;
    T1
)

Shin様 早い回答有り難うございます。

#4 2022-08-22 18:56:11

Shin
Member

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

条件の n と n ≥ 1 は、n > 0 を含めて、n が負にならない限り同じ結果です。n だけのほうが、ごく僅か処理が早くなります。

Last edited by Shin (2022-08-22 18:56:55)

Offline

#5 2022-08-22 21:36:02

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

条件の n と n ≥ 1 は、n > 0 を含めて、n が負にならない限り同じ結果です。n だけのほうが、ごく僅か処理が早くなります。

いまいち、ここの条件部分が理解できませんでしたが、無駄な処理が不必要になる!!・・・勉強します

#6 2022-08-22 22:14:30

Shin
Member

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

初期値で7が設定されます。7は0でないので真です。
処理ごとに1引かれていき、0になります。0は偽ですので、処理が終わります。

多くの人、おそらく9割以上、が、初期値に1を設定し、処理ごとに1加えていき、7になったかどうかを判断するように作ります。今回のように、減らして行った方がスマートだと思うのですが、

Offline

#7 2022-08-24 11:27:56

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

多分別の問題になると思いますが、元のリストに「りんご」「リンゴ」「リンゴ」のテキストが含まれている場合下記のように文字パターン全て設定をしなければならないのでしょうか
While (
[
    T0 = List::list ;
    S1 = Hiragana ( List::a1);
    S2 = KanaZenkaku (List::a1 );
    S3 = Katakana ( List::a1 );
    S4 = KanaHankaku ( Katakana ( List::a1 ));
    n = ValueCount ( T0 ) ;
    T1 = ""
] ;
    n;
[
    Tn = GetValue ( T0 ; n ) ;
    T1 = Case ( PatternCount ( Tn ; S1 ) or PatternCount ( Tn ; S2 ) or PatternCount ( Tn ; S3 ) or PatternCount ( Tn ; S4 ); List ( Tn ; T1 ) ; T1 ) ;
    n = n - 1
] ;
    T1
)
たぶん、ゆるやか検索みたいな「~りんご」はPatternCount ()の検索テキストに使えないので他にないかと思い質問しました。

#8 2022-08-24 13:13:45

Shin
Member

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

近道は無いので、地道に計算させるしか無いです。
もう少し簡単にする方法として、元リストを例えば半角カナに変換しておき、"リンゴ" を検索する、という方法もあります。

Offline

#9 2022-08-24 13:25:01

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

近道は無いので、地道に計算させるしか無いです。

ですか、数字を加えると6パターンになるが計算式を作るのが1度だけと・・・
有り難うございました。

#10 2022-08-24 13:33:42

チポ
Member

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

Hiragana ( List )として、
Hiragana ( a1 )で判定して、
元のListから返すようにする手もありますね。

Offline

#11 2022-08-24 13:42:40

himadanee
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

文字種変換する場合は関係ない単語が偶然一致する可能性がないかも考慮する必要が
プリンごま団子
とか...

#12 2022-08-24 20:59:11

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

言葉の問題は、変換以前から諦めていました。例えば「キリンゴールドマスター」も「りんご」で拾ってくるので・・・せめて検出文字をハイライトで示してほしいと常々思っています。
皆さん有り難うございました。

#13 2022-08-24 22:44:39

himadanee
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

この場合は計算式を作ってるのは自分なので、「検出文字をハイライトで示してほしい」ならそういう計算式にすればいいだけです。
レコードの検索した時に、とかなら話は別ですが

Substitute ( 文字列 ; 対象文字列 ; TextStyleAdd ( 対象文字列 ; HighlightYellow ) )
でハイライトになります。

#14 2022-08-25 05:30:49

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

ああそうかレコード検索と勘違いしていた。
なるほど、これでこの場合はハイライトにすればいいのか。度々の指摘有り難うございました。

#15 2022-08-31 16:27:44

koko009
Guest

Re: Loop処理にifを使っているスクリプトをwhile()に書き換えたい

今回のwhile(・・・)でもフィールドの文字数で処理速度が大きく変化するので
https://fm-aid.com/bbs2/viewtopic.php?id=13358
himadaneeさんのローカル変数を使う方法で処理速度が改善した
行数:3000行の改行テキスト、文字数:320374
$無し:51866
$有り:913
行数:2000行の改行テキスト、文字数:213963
$無し:417
$有り:420
ブラウザを開いたまま計測しているのであまり参考にならないが・・・
余計な投稿ですみません。

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 573.63 KiB (Peak: 590.53 KiB) ]