1 2 前へ 次へ 18 返信 最新の回答 日時: Nov 24, 2015 1:50 AM ユーザー:まるみ

    Position関数で

    まるみ

           Position関数で or 検索がしたいのですが、どうすればよいでしょうか。

       

      Position(検索テキスト ; "福沢" or "福澤"; 1; 2)    // これでは動きませんが...

       

      こんな感じで例えば、

       

      「ここに福沢諭吉の像がある。福澤先生は一万円札の人である」

       

      とすれば、「14」の値が返ってくる、というふうにしたいのです。

        • 1. Re: Position関数で
          user19752

          Position(Substitute(検索テキスト ; "福沢" ;"福澤" ) "福澤"; 1; 2)

          • 2. Re: Position関数で
            まるみ

            すぐにレスをいただきありがとうございます。

             

            実は or で検索する文字列が可変でして、極端に言えば、「甘党」or「日本甘味党」みたいになります。

             

            「彼は甘党です。日本甘味党は2001年にできました」

             

            この場合、置換すると、もとの文字列の何文字目かが分からなくなります。

            他の方法としてはどうすればよいでしょうか。

            • 3. Re: Position関数で
              sago350@未来Switch

              「ここに福沢諭吉の像がある。福澤先生は一万円札の人である」

              で、「福沢」or「福澤」で検索した場合に、14が返る条件がよくわからないのですが・・・。

              or検索が出来たとして、4または14が返ってくる可能性があって、どちらにすれば?

              • 4. Re: Position関数で
                sago350@未来Switch

                複数の条件があった場合に、それぞれの場所を出すことは出来ますが・・・。

                 

                Dropbox - Position関数でor.fmp12

                スクリーンショット 2015-11-23 21.56.45.png

                • 5. Re: Position関数で
                  まるみ

                  Position ( テキスト ; 検索テキスト ; 先頭文字位置 ; 回数 )

                   

                   の回数で制御するのが目的です。

                   user19752さんの回答のような手法で置換して、PatternCount関数で文字列の数は取得できました。

                   そして、任意の場所の文字列をいじりたいのです。ある時は2番め、ある時は3番めといったふうに。

                   ただ、先頭文字位置の取得がうまくいきません。

                   

                  甘党が甘党に日本甘味党の甘党と日本甘味党・・・

                  • 6. Re: Position関数で
                    まるみ

                    sagoさん、ありがとうございます。

                    上の回答が前後しました。繰り返しフィールドは使ったことがなく、参考になりました。

                    ただ、今回、わたしがしたい方法とは異なるようです。

                     

                    単にPosition関数でorができればすぐに解決すると思うのですが、とても困難なようですね。。。

                     

                      甘党が甘党に日本甘味党の甘党と日本甘味党・・・

                    回数1  2  3     4  5

                    文字1  4  7     13  15

                    こんなふうに数値を取得したい。

                    • 7. Re: Position関数で
                      sago350@未来Switch

                      さっきのアップデートしました。

                      これで、何番目かは解るので、なんとか取り出せるかと。

                      検索語は5個限定です。(もっとエレガントな方法があるかと)

                       

                      スクリーンショット 2015-11-23 22.50.24.png

                      • 8. Re: Position関数で
                        まるみ

                        sagoさん、夜にこのように回答してくださりありがとうございます!。

                        提示していただいた方法なら、取り出せますね。

                        ただ、繰り返しフィールドをつくるという点で扱いが難しいです。。。

                        検索語の数は2つなので、問題ないですが、検索したいテキストは多ければ5,000~10,000文字ほどあります。

                        わたしの方では、Left関数で切り取りながら数えることを考えているところです。

                         

                        何か別のアイデアをもう少し待ってみたいと思います。

                        • 9. Re: Position関数で
                          sago350@未来Switch

                          検索したいテキストが5,000~10,000文字あるので、結果が溢れてしまうということでしょうか?

                          結果1〜5の繰り返し数を増やすか、改行区切りにすればなんとかなるかなと。

                          • 10. Re: Position関数で
                            user19752

                            「回数で制御」の意味がループで順に処理するということなら、2つの小さい方が求める位置なので

                            Min(Position(text;find1;1;1);Position(text;find2;1;1))

                            2番め以降は、1番目の位置+1(または見つかった文字列の文字数)から検索すればいいですよね。

                            • 11. Re: Position関数で
                              user14047

                              カスタム関数にしてみました。

                              カスタム関数をご自身のソリューションに移植するには FileMaker Pro Advanced が必要です。

                               

                              /*==============================================================
                                   カスタム関数   VaguePosition ( テキスト ; 検索テキストリスト ; 先頭文字位置 ; 回数 )
                                   テキスト内で複数の検索テキストを検索し、指定された回数目(複数テキスト通算)の先頭文字位置を返します。
                                   例)VaguePosition ( "広島県廣島市広島町" ; "廣島¶広島" ; 1 ; 3 ) の場合
                                   "広島県廣島市広島町" の中から、"廣島", "広島" のどちらかがあれば回数としてカウントするので通算 3 回目の
                                   出現の文字位置の 7 を返します。
                              
                                   曖昧ポジションっていうカスタム関数名のネーミングは再考の余地あり (^^;
                              
                                   計算式中で SortList カスタム関数 <https://www.briandunning.com/cf/1181> を利用しています。
                              
                              create: chamo 2015.11.23
                              modified: chamo
                              =============================================================*/
                              
                              Let (
                                   [
                                   ~先頭文字位置 = Int ( GetAsNumber ( 先頭文字位置 ) ) ;
                                   ~回数 = Int ( GetAsNumber ( 回数 ) ) ;
                                   ~検索テキストリスト数 = ValueCount ( 検索テキストリスト ) ;
                                   $~i = $~i + 1 ;
                                   ~検索テキスト = GetValue ( 検索テキストリスト ; $~i )
                                   ] ;
                                   Case (
                                      $~i ≤ ~検索テキストリスト数 ;
                                         Let (
                                            [
                                            ~検索テキスト数 = PatternCount ( テキスト ; ~検索テキスト ) ;
                                            $~ii = $~ii + 1 ;
                                            $~resultTemp = Position ( テキスト ; ~検索テキスト ; ~先頭文字位置 ; $~ii ) ;
                                            $~result =
                                                 List (
                                                    $~result ;
                                                    Case ( $~resultTemp ; $~resultTemp )
                                                 )
                                            ] ;
                                            Case (
                                                 $~ii ≤ ~検索テキスト数 ;
                                                    // ~検索テキストリストの $~i 番目の検索テキストがまだある場合は $~i の数が増えないように -1 しておく
                                                    Let ( [ $~i = $~i - 1  ] ; "") &
                                                    VaguePosition ( テキスト ; 検索テキストリスト ; 先頭文字位置 ; 回数 ) ;
                                                 // 変数初期化して2順目の再帰
                                                    Let ( [ $~ii = "" ] ; "") &
                                                    VaguePosition ( テキスト ; 検索テキストリスト ; 先頭文字位置 ; 回数 )
                                            )
                                         ) ;
                                      // $~result をカスタム関数 SortList 関数を使って昇順ソートし最終的に指定された回数目を取り出す
                                      GetValue ( SortList (  $~result ; "Asc" ; "Number" )  ; ~回数 ) &
                                      // 変数初期化
                                      Let ( [ $~i = ""  ; $~ii = "" ; $~result = "" ] ; "" )
                              
                                   )
                              )
                              
                              • 12. Re: Position関数で
                                user14047
                                If [ $cnt = 1 ]
                                <省略>
                                End If
                                

                                 

                                のところ

                                 

                                フィールドを名前で設定 [ "Position関数でor::結果" & $cnt & "[" & $回数 & "]" ; $位置 ]
                                

                                 

                                にしちゃえば、結果+数字 という命名規則でフィールド作れば、スクリプトを変更することなくいくつでもフィールド作れますね。

                                検索テキストは 2 つということなので今回は関係ないですが...

                                • 13. Re: Position関数で
                                  user14047

                                  テキストが "甘党が甘党に日本甘党の甘党と日本甘党" で
                                  検索テキストが、"甘党" と "日本甘党" のように、他の検索テキストが含まれる検索テキストを指定した場合、意図しない?結果(下段)になってしまいます。

                                   

                                  甘党甘党日本甘党甘党日本甘党
                                  回数12345
                                  位置1471215
                                  回数1234567
                                  位置1479121517
                                  • 14. Re: Position関数で
                                    まるみ

                                    user14047さん、カスタム関数の作成とは、本当にありがとうございます!

                                    わたしはAdvancedでないので、現時点で使用できませんが、将来乗り換える予定ですし、同じ問題を抱えている方にも使ってもらえると思います。

                                     

                                    わたしの方でも、ずっと考えておりまして、なんとか動くものができましたので、紹介しておきます。

                                    user19752さんのアドバイスをもとにしています。

                                     

                                    --------------------------------------------------

                                    変数を設定[$wordcnt; 値: (任意)] // Position() の回数に相当

                                    変数を設定[$cnt; 値:0]

                                    変数を設定[$p1; 値:1]

                                    変数を設定[$p2; 値:2]

                                    Loop

                                      変数を設定[$cnt; 値:$cnt +1]

                                      Exit Loop If[$cnt > $wordcnt]

                                      If[  Position ( Textフィールド ; "検索1" ; 1 ; $p1 ) < Position ( Textフィールド ; "検索2" ; 1 ; $p2 ) xor ( Position ( Textフィールド ; "検索2" ; 1 ; $p2 ) = 0 ) ]

                                      変数を設定[$p1; 値:$p1 +1]

                                      Else If[ Position ( $Textフィールド ; "検索1" ; 1 ; $p1 ) > Position ( Textフィールド ; "検索2" ; 1 ; $p2 ) xor ( Position ( Textフィールド ; "検索1" ; 1 ; $p1 ) = 0 ) ]

                                       変数を設定[$p2; 値:$p2 +1]

                                      End If

                                    End Loop

                                    フィールド設定[ If ( (Position ( Textフィールド ; "検索1" ; 1 ; $p1 ) < Position ( Textフィールド ; "検索2" ; 1 ; $p2 ) ) xor ( Position ( Textフィールド ; "検索2" ; 1 ; $p2 ) = 0 ) ; Position ( Textフィールド ; "検索1" ; 1 ; $p1 ) ; Position ( Textフィールド ; "検索2" ; 1 ; $p2 ) ) ]

                                    --------------------------------------------------

                                     

                                    エンジニアじゃないので、スマートかは分かりませんが、これで思うようには動くようです。

                                    1 2 前へ 次へ