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

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

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

You are not logged in.

Announcement

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


#1 2017-07-11 18:06:12

mezashix
Member

文字列を分割して、各文字の読みを自動的に付与したい

あるシステムのパスワード発行証を作成しています。
パスワード自体は、そのシステムで発行しコピーしてFMに持ってきます。

例えば以下のようなパスワードが発行されたとします
[ 8dNHDhKO ]

初期パスワードフィールド = 8dNHDhKO
パスワードの読みフィールド = はち・ディー小・エヌ大・エイチ大・ディー大・エイチ小・ケイ大・オー大

ルールは
英語はカタカナ、数字はひらがな
英語の大文字はカナの後ろに「大」、小文字は「小」
文字と文字の間は「・」

初期パスワードの文字を分解して1文字ずつ当てはめて、読みフィールドに格納
1文字ごとに「・」を追加していけばいいと思うのですが・・・

環境は以下です。
Windows10、FileMaker PRO 14

よろしくお願いします。

Offline

#2 2017-07-11 18:16:53

チポ
Member

Re: 文字列を分割して、各文字の読みを自動的に付与したい

使われる全ての文字とその読みのテーブルが必要でしょう。

それが有れば、
一文字ずつ分解したフィールドを作り、
その一つ一つとリレーションして、読みを参照出来ます。

Offline

#3 2017-07-11 23:36:45

Hiro
Member

Re: 文字列を分割して、各文字の読みを自動的に付与したい

ExecuteSQLのWHERE IN(複数キー配列) 句を利用した関数計算式で、任意パス文字列を一発「読み」変換する方法。
詳細説明代わりにサンプルをアップしておきます。

●SQL作例サンプル「文字列の読み変換.fmp12」→ https://yahoo.jp/box/hnZMQ8

・別途「読みテーブル」を作り、全種英数「文字」対「読み」の対応表を用意しておく
(読みテーブルには、例示パス「8dNHDhKO」の最低限データだけを仮入れしてあります。)
「1」 → 「いち」
「2」 → 「に」
   ・・・・・・
「a」 → 「エー小」
「b」 → 「ビー小」
   ・・・・・・・
「A」 → 「エー大」
「B」 → 「ビー大」
   ・・・・・・・

・ループ式で、パスワード文字列をIN(キー配列)へ変換、(それを変数$inに格納)
「8dNHDhKO」 → 「'8','d','N','H','D','h','K','O'」($in)
・それをSQLのIN構文に代入、ExecuteSQLで実行します。
読みフィールド = 「はち・ディー小・エヌ大・エイチ大・ディー大・エイチ小・ケイ大・オー大」
・全体式は、

Let(
[
   $txt=パスワード文字列フィールド;
   $res="";
   $fnc="Case(IsEmpty($txt); Substitute($res; [\¶;\",\"]);
      Let([
         $res=List($res; \"'\"& Left($txt;1) &\"'\");
         $txt=Replace($txt;1;1;\"\")
         ]; Evaluate($fnc) )
      )";
   $in=Evaluate($fnc);
   $sql="ExecuteSQL(\"SELECT \\\"読み\\\" FROM \\\"読みテーブル\\\" WHERE \\\"文字\\\" IN(" & $in & ")\" ; \"\" ; \"・\" )"
];
   Evaluate($sql)
)


====================================

【致命的バグを発見・お詫びと報告】
このSQL「IN」句での一括変換を利用した時に、元の文字順が維持できない事が分かり、
検証の甘さをお詫びするとともに、一旦この投稿案のボツをお願いします。

回避案が見つかった時は別途投稿をいたします。
多分、一文字づつSQL変換してゆく多少冗長なループ式になるかな、


====================================

【バグ修正完了の報告】
SQL ORDER BYの「CASE」条件句で、元の文字順をカスタム指定できましたので、バグ修正完了の報告をいたします。
修正済サンプルを先のアドレスに上書きアップしましたので、再ダウンロードください。

前式は下記に変更になりました。

Let(
[
   $txt=パスワード文字列フィールド;
   $res="";
   $rst="";
   $fnc="Case(IsEmpty($txt); List(Substitute($res; [\¶;\",\"]); Substitute(FilterValues($rst;$rst); [\¶;\",\"]));
      Let([
         $res=List($res; \"'\"& Left($txt;1) &\"'\");
         $rst=List($rst; \"CASE \\\\\\\"文字\\\\\\\" WHEN '\"& Left($txt;1) &\"' THEN 1 ELSE 2 END\");
         $txt=Replace($txt;1;1;\"\")
      ]; Evaluate($fnc) )
      )";
   #arg=Evaluate($fnc);
   #in=GetValue(#arg; 1);
   #odr=GetValue(#arg; 2);
   #sql="ExecuteSQL(\"SELECT \\\"読み\\\" FROM \\\"読みテーブル\\\" WHERE \\\"文字\\\" IN(" & #in & ") ORDER BY " & #odr & "\\\"文字\\\" \" ; \"\" ; \"・\" )"
];
   Evaluate(#sql)
)




====================================
【修正版のバグを再度発見・お詫びと報告】
====================================
「IN」と「CASE」SQL句での順指定・一括変換する手法は、
2番目以降の重複文字は無効となる致命的バグがあるのが判明しました。
度重なる検証の甘さをお詫びするとともに、一旦この投稿のボツをお願いします。
改善案は別途投稿でお知らせします。

Last edited by Hiro (2017-07-12 13:07:05)

Offline

#4 2017-07-12 00:19:33

Shin
Member

Re: 文字列を分割して、各文字の読みを自動的に付与したい

べたべたな方法で、
Replace (
Substitute ( テキスト ;
["1" ; "・いち"];
["2" ; "・に"];
   ・・・・・・
["a" ; "・エー小"];
["b" ; "・ビー小"];
   ・・・・・・・
["A" ; "・エー大"];
["B" ; "・ビー大"];
   ・・・・・・・) ; 1 ; 1 ; "" )
文字数の制限にかからなければいいけど

Offline

#5 2017-07-12 13:13:17

Hiro
Member

Re: 文字列を分割して、各文字の読みを自動的に付与したい

【バグフィックスの報告】
バグの原因となる、SQLのIN句での文字列一括検索を諦め、
地道に1文字づつSQL検索を繰り返すループ式に切替えました。
時間も思ったほど掛からず、式もぐっとシンプルになりました。

●SQL作例v2版「文字列の読み変換v2.fmp12」→ https://yahoo.jp/box/nvgm54


Let(
[
   $txt=パスワード文字列フィールド;
   $sql="ExecuteSQL(\"SELECT \\\"読み\\\" FROM \\\"読みテーブル\\\" WHERE \\\"文字\\\"='キー' \" ; \"\" ; \"\" )";
   $res="";
   $fnc="Case(IsEmpty($txt); $res;
         Let([
            #add=Evaluate(Substitute($sql; [\"キー\";Left($txt;1)]));
            $res=List($res; #add);
            $txt=Replace($txt;1;1;\"\")
         ]; Evaluate($fnc) )
      )"
];
   Substitute(Evaluate($fnc); [¶;"・"])
)

Offline

#6 2017-07-12 14:45:49

mezashix
Member

Re: 文字列を分割して、各文字の読みを自動的に付与したい

希望した形の内容で表示させることが出来ました。
「文字列を分解して対応するものに置き換える」という内容に幅広く応用が利きそうです。

恥ずかしながら、本格的にFMを使い始めたところでSQLどころか
他のスクリプトも、いろんなものを参考に勉強しながら作成していました。
先に回答頂いていたものも、スクリプトを解析をさせて頂く中で、非常に勉強になりました。

何度も細かな検証まで行っていただきありがとうございました。

※投稿のボツのやり方がわからず記載頂いた内容をそのままにしていますが、ご容赦ください。

Hiro wrote:

【バグフィックスの報告】
バグの原因となる、SQLのIN句での文字列一括検索を諦め、
地道に1文字づつSQL検索を繰り返すループ式に切替えました。
時間も思ったほど掛からず、式もぐっとシンプルになりました。

●SQL作例v2版「文字列の読み変換v2.fmp12」→ https://yahoo.jp/box/nvgm54


Let(
[
   $txt=パスワード文字列フィールド;
   $sql="ExecuteSQL(\"SELECT \\\"読み\\\" FROM \\\"読みテーブル\\\" WHERE \\\"文字\\\"='キー' \" ; \"\" ; \"\" )";
   $res="";
   $fnc="Case(IsEmpty($txt); $res;
         Let([
            #add=Evaluate(Substitute($sql; [\"キー\";Left($txt;1)]));
            $res=List($res; #add);
            $txt=Replace($txt;1;1;\"\")
         ]; Evaluate($fnc) )
      )"
];
   Substitute(Evaluate($fnc); [¶;"・"])
)

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.004 seconds, 7 queries executed - Memory usage: 542.3 KiB (Peak: 563.2 KiB) ]