みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
いつもお世話になっております。下記のような改行リストから任意のテキストを含む行を抽出する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
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
少しタイプミスを手直しし下記の式で結果を得られました。
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様 早い回答有り難うございます。
条件の n と n ≥ 1 は、n > 0 を含めて、n が負にならない限り同じ結果です。n だけのほうが、ごく僅か処理が早くなります。
Last edited by Shin (2022-08-22 18:56:55)
Offline
条件の n と n ≥ 1 は、n > 0 を含めて、n が負にならない限り同じ結果です。n だけのほうが、ごく僅か処理が早くなります。
いまいち、ここの条件部分が理解できませんでしたが、無駄な処理が不必要になる!!・・・勉強します
初期値で7が設定されます。7は0でないので真です。
処理ごとに1引かれていき、0になります。0は偽ですので、処理が終わります。
多くの人、おそらく9割以上、が、初期値に1を設定し、処理ごとに1加えていき、7になったかどうかを判断するように作ります。今回のように、減らして行った方がスマートだと思うのですが、
Offline
多分別の問題になると思いますが、元のリストに「りんご」「リンゴ」「リンゴ」のテキストが含まれている場合下記のように文字パターン全て設定をしなければならないのでしょうか
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 ()の検索テキストに使えないので他にないかと思い質問しました。
近道は無いので、地道に計算させるしか無いです。
もう少し簡単にする方法として、元リストを例えば半角カナに変換しておき、"リンゴ" を検索する、という方法もあります。
Offline
近道は無いので、地道に計算させるしか無いです。
ですか、数字を加えると6パターンになるが計算式を作るのが1度だけと・・・
有り難うございました。
Hiragana ( List )として、
Hiragana ( a1 )で判定して、
元のListから返すようにする手もありますね。
Offline
文字種変換する場合は関係ない単語が偶然一致する可能性がないかも考慮する必要が
プリンごま団子
とか...
言葉の問題は、変換以前から諦めていました。例えば「キリンゴールドマスター」も「りんご」で拾ってくるので・・・せめて検出文字をハイライトで示してほしいと常々思っています。
皆さん有り難うございました。
この場合は計算式を作ってるのは自分なので、「検出文字をハイライトで示してほしい」ならそういう計算式にすればいいだけです。
レコードの検索した時に、とかなら話は別ですが
Substitute ( 文字列 ; 対象文字列 ; TextStyleAdd ( 対象文字列 ; HighlightYellow ) )
でハイライトになります。
ああそうかレコード検索と勘違いしていた。
なるほど、これでこの場合はハイライトにすればいいのか。度々の指摘有り難うございました。
今回のwhile(・・・)でもフィールドの文字数で処理速度が大きく変化するので
https://fm-aid.com/bbs2/viewtopic.php?id=13358
himadaneeさんのローカル変数を使う方法で処理速度が改善した
行数:3000行の改行テキスト、文字数:320374
$無し:51866
$有り:913
行数:2000行の改行テキスト、文字数:213963
$無し:417
$有り:420
ブラウザを開いたまま計測しているのであまり参考にならないが・・・
余計な投稿ですみません。
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 575.58 KiB (Peak: 592.48 KiB) ]