みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
こんにちは。
テキスト形式のフィールド「メモ」があります。
そこに入力される機種依存文字を検知して別の文字列に置換したいと考えていたのですが、
PatternCountとSubstitute関数で1文字ずつ置換していたのでは間に合わないほど機種依存文字が大量にある為、
1.別テーブルに「置換前」「置換後」という2つのフィールドを作成
2.同テーブルに機種依存文字と置換後の文字列を全て登録
3.「メモ」フィールドからカーソルを外すタイミングで、前項の「置換前」に登録した全ての文字列をチェックし、該当文字があれば「置換後」の文字列に置換。
という動作をさせたいと思いますが、どのようにすれば可能か、ご教授頂けますと助かります。
Win7、FMP11です。
よろしくお願いします。
一点補足させて下さい。
>3.「メモ」フィールドからカーソルを外すタイミングで、前項の「置換前」に登録した全ての文字列をチェックし、該当文字があれば「置換後」の文字列に置換。
該当が無ければ何もしないというのが必須になっております。
変換テーブル側に、計算フィールド「変換式」
"[ \"" & 置換対象 & "\" ; \"" & 置換文字 & "\" ]"
を作っておきます
そのテーブルと、変換表のテーブルをデカルト積でリレーション(×リレーション)しておきます。
次の式を、目的のテキストフィールドに、自動入力:計算式:フィールドに値があれば...を外す で設定します。
Evaluate (
"Substitute ( text ;" & Substitute ( List ( 置換表::変換式 ) ; ¶ ; ";" ) & " )"
)
https://dl.dropboxusercontent.com/u/926 … 73.fp7.zip
https://www.dropbox.com/s/gaspg9yl22vtp … 7.zip?dl=0
Last edited by Shin (2017-06-10 18:47:28)
Offline
Substituteは999個までですが、置換したい文字が何個あったんですかね。
OnExitトリガーでSubstitute書換式を実行する案。
Substitute関数は、1000キーまでの一括置換が可能な上、処理スピードも高速です。
・機種依存文字は1000種以下と推測しますが、それが前提の案です。
・Substituteの式設定は、キーが多量のため、"式"をフィールド値からテキスト生成して Evaluate("生成テキスト式") で実行すると良さそう。
Offline
横からスミマセン
#3のShinさんのサンプルファイルを再度アップロードしていただけないでしょうか?
話の流れだけで作ってみたのですが上手く動作せずに?が表示されるだけなので・・・
会社名の入っているテキストフィールドから(株)や(有)などを抜き取りたいのですがそれを除去リストにして利用ユーザーが登録できるようにしたいためです。
よろしくおねがいします。
Offline
こんにちは。
ちょっと時間かかってしまいましたがShinさんが再アップロードしていただいたファイルを元に移植して何とか動作しました。
会社名(テキストフィールド)から商号無会社名(計算値での自動入力)と出来ました。
ありがとうございました。
----- 以下は余分な事かもしれませんが・・・ -----
ただ、「有限会社○○」や「△△株式会社」、「㈲□□」などは出来るのですが「(有)」、「(株)」などのカッコ付きがどうしても除去出来ませんでした。
自分で何回も何回も見直したのですが、結果的には”式フィールド”の計算結果が”テキスト”でなく”数字”になっている為でした。
「有限会社」や「株式会社」などが除去出来ているので逆にコレだけを見つける為に数時間かかってしまいました。
たった1ヶ所の設定違いでも動作を左右する事を改めて気づかされた事でした。
サンプルをあげてくださったShinさん、その他の皆さんどうもありがとうございました。
Offline
時間が経ってからの横レスで申し訳ございません。
まさに私が行き詰まっている内容だったのでShinさんが作成されたサンプルをDLし、
手持ちのデータをサンプルにインポートして試みたのですが
計算結果が「?」となってしまいました。
サンプルの壱や貳では問題なく動いていました。
置換対象が250程と数が多いことが原因ではないかと思ってはいるのですが
解決方法が分かりません。
また、こちらで書かれた「メモ」のテキストフィールドも10,000文字程度となります。
(置換対象を減らすと「メモ」が10,000文字程度でも問題なく動いているように思いました。)
Hiroさんが書かれていたOnExitトリガーでフィールド設定のスクリプトでsubstituteを行う方法も試してみましたが
「?」となってしまいました。
もしかしたら、方法が間違っているのかもしれません。
もし、解決方法がお分かりの方がいらっしゃいましたら
お力をお借りできませんでしょうか?
置換対象が200くらいになると、作成した計算式が10000文字を超える可能性があります。そのためにエラーになっているのでは。
2回に分けて処理を行うか、その置換式を繰り返し実行する While() を使うかで解消すると思います。
Offline
Shinさま
早速ありがとうございます。
頂いたヒントを参考に頑張ってみます。
自力で処理を分散する方法やWhile関数を扱えなかったので
下記のスレッドにあるHiroさんのスクリプトを参考にさせて頂いたのですが
「?」となってしまうことを解消することはできませんでした。
(Hiroさんのスクリプトで登録した単語を削除することはできました。)
参考スレッド:
https://fm-aid.com/bbs2/viewtopic.php?id=3036
使用したスクリプト
Let([
$unt=200;
$vl=ValueListItems(Get(ファイル名); "その値一覧名");
$txt = GetAsCSS (TextFontRemove (TextColorRemove(TextSizeRemove (text) )));
$vct=ValueCount($vl);
$j=0;
$elm=";[\"<<itm>>\";\"\"]";
$res="";
$fnc=
"Case($vct<=$unt*$j; $res;
Let([
$lst=MiddleValues($vl;$unt*$j+1;$unt);
$n=ValueCount($lst);
$i=0;
$res=$res & Evaluate($sub);
$j=$j+1
]; Evaluate($fnc))
)";
$sub=
"Case($i=$n; $res;
Let([
$i=$i+1;
$itm=GetValue($lst;$i);
$prm=Substitute($elm;[\"<<itm>>\";$itm]);
$res=$res & $prm
]; Evaluate($sub))
)"
];
Evaluate("Substitute ($txt" & Substitute ( List ( 置換表::変換式 ) ; ¶ ; ";" ) & " )")
)
上記のスクリプトのうち、【 $prm=Substitute($elm;[\"<<itm>>\";$itm]);】の
【\"<<itm>>\"】が何を意味するのか特に理解できませんでした。
実際に行いたいのは2つの文章の書式を比較することです。
斜体、太字、上付、下付などが正しく反映されているかどうかを確認したいと思っています。
今回のスクリプト(もしくは計算式)では
cssに変換されてしまった実体参照符号を元の表記に戻したいと考えていましたが、
もし、書式の比較方法が他にあれば、教えて頂けると大変助かります。
どうぞよろしくお願いいたします。
1個のグローバルフィールドの追加、リレーションの設定と、6行ほどの簡単なスクリプトだけでおこなう、面白いサンプルです。置換側のレコード数に制限はありません。
https://www.dropbox.com/scl/fi/cq12b7wo … 2t6qn&dl=0
Last edited by Shin (2023-12-13 13:51:40)
Offline
>実際に行いたいのは2つの文章の書式を比較することです。
それだと全然別の話なので、新規に質問した方がいいのでは。
違いがあるかどうかは簡単に調べられますが、どこが違うかを元のテキストで示したいってことですね?
Shinさま
サンプルをありがとうございました。
理想としていた動きをしてくれました!
変数が出てくると理解が追いつかなくなってしまうのですが
シンプルなスクリプトを組んで頂いたので
まずはグローバルフィールドを勉強し理解を深めようと思います。
この度は何度も助けて頂き、ありがとうございました。
とても助かりました。
himadaneeさま
ご助言ありがとうございます。
理想はhimadaneeさまがおっしゃるように書式の差分が元のテキストに強調や赤字などで一目で分かるようなシステムを作りたいと考えていますが
初心者のため、やりたい内容をもう一度整理してみて、改めて新規に質問をさせて頂こうと思います。
その際は、どうぞよろしくお願いいたします。
Pages: 1
[ Generated in 0.006 seconds, 7 queries executed - Memory usage: 555.12 KiB (Peak: 576.02 KiB) ]