みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
Pro17をWindows7上で使っております。
テキストフィールドがあり、そこに「chbfaiedjgk」などという任意の文字列の値があります(半角英字のみ、a~z)。
この値に何らかの計算式やスクリプトを働かせて、「abcdefghijk」とアルファベット順に変換する方法はありますか?
同じ文字が含まれていても、文字数は変えずにそのまま出るようにしたいです(例:abcdcba → aabbccd)。
スクリプトを使った一例です。
テキスト→値一覧→ソート→テキスト
/* 元の値を$paramにセット */
変数を設定[ $param ; 値: Get(スクリプト引数)]
変数を設定[ $count ; 値: 1]
変数を設定[ $list ; 値: ""]
/* 値一覧に変換 */
Loop
変数を設定[ $list ; 値 $list & Middle( $param ; $count ; 1] & ¶ ]
変数を設定[ $count ; 値: $count+1 ]
Exit Loop If [ $count > Length( $param ) ]
End Loop
/* ソートしてから改行を取り除く */
変数を設定[ $list ; 値: SortValues( $list )]
変数を設定[ $list ; 値: Substitute ( $list ; ¶ ; "" ) ]
/* 結果を格納 */
フィールド設定 [ サンプル::結果 ; $list ]
Last edited by koeda (2019-08-08 22:20:06)
Offline
Filter ( "abcdefghijknopqrstuvwxyz" ; テキスト )
を試してみてください。ひょっとしてダメかも
Last edited by Shin (2019-08-09 00:50:23)
Offline
重複文字も含め重複ソート可能なSortValues関数を利用する式例です。
【計算手順】
1.文字列を一覧リストに変更
abcdcda
↓
a
b
c
d
c
b
a
2.SortValues関数でリスト内容をソート
a
a
b
b
c
c
d
3.リストを文字列に戻してお終い
aabbccd
Let([
$txt=テキストフィールド;
$fnc="Case($i=Length($txt); $res;Let([$i=$i+1;$res=List($res;Middle($txt;$i;1))]; Evaluate($fnc)))"
];
Substitute(SortValues(Evaluate($fnc)); [¶;""])
)
Offline
Koeda様 Shin様 Hiro様
ありがとうございました。スクリプト、計算式いろいろな方法があるのですね。
いろいろな局面で使えそうで大変ありがたいです。
Koeda様のスクリプトによる変換方式で、いくつかテストしてみましたが、変換後の値を見る限り、うまくいけそうです。
Shin様の Filter ( "abcdefghijknopqrstuvwxyz" ; テキストフィールド ) は、変換後の値で重複した文字は一つにまとまってしまうようです。
Hiro様のご提案された計算手順で、私なりに式を作ってみました。変換後の値を見る限り、うまくいけそうです。ただ式が長すぎて・・・
Substitute (
SortValues (
List (
Middle ( テキストフィールド ; 1 ; 1 ) ;
Middle ( テキストフィールド ; 2 ; 1 ) ;
Middle ( テキストフィールド ; 3 ; 1 ) ;
・
・
・
Middle ( テキストフィールド ; 50 ; 1 ) ;
))
; ¶ ; "" )
この・・・の部分で50文字以内に限定せずどんな文字数でも対応可能な一つの計算式があるとよいです。
ご提案いただいた
Let([
$txt=テキストフィールド;
$fnc="Case($i=Length($txt); $res;Let([$i=$i+1;$res=List($res;Middle($txt;$i;1))]; Evaluate($fnc)))"
];
Substitute(SortValues(Evaluate($fnc)); [¶;""])
)
では変換後の値が「?」になってしまいました。
Hiro様
ご提案いただいた
Let([
$txt=テキストフィールド;
$fnc="Case($i=Length($txt); $res;Let([$i=$i+1;$res=List($res;Middle($txt;$i;1))]; Evaluate($fnc)))"
];
Substitute(SortValues(Evaluate($fnc)); [¶;""])
)
では変換後の値が「?」になってしまいました。
動作検証してみました。
上式をコピーして動作テストしてみましたが、全く問題ありません。
そこで、「?」が返るのを推察するに、計算結果が「数値」タイプになっている単純ミスではないかと思われます。
計算結果のデータ形式を「テキスト」タイプへ設定変更して、再度お試しください。
Last edited by Hiro (2019-08-10 00:35:54)
Offline
Hiro様
言葉足らずですみません。変換後のフィールドは計算結果はもともとテキストに設定しております。
たしかにこの式を組みこんでみたところ、最初は正しい値が表示されました。
ただ、その後で元のテキストフィールドの値を変えてみたところ、それ以降は常に変換後の値が「?」です。
ちなみに、さきほどこの計算結果を索引オプションで「計算結果を保存せず必要時に再計算する」にチェックを入れて「非保存」状態にしましたところ、再び正しい値が表示されました。
しかし、テキストフィールドの値を変えるたびにフリーズ状態に陥って強制終了をかけなければ終わらない状態になってしまいます。
どうしたらよいでしょうか。
まだ駄目ですか?
後考えられるは、
■ループ式内繰り越し変数の初期値設定、かな?
Let([
$txt=テキストフィールド;
$i=0;
$res="";
$fnc="Case($i=Length($txt); $res;Let([$i=$i+1;$res=List($res;Middle($txt;$i;1))]; Evaluate($fnc)))"
];
Substitute(SortValues(Evaluate($fnc)); [¶;""])
)
■また、このループ式のループ回数には、計算限界回数があります。
テキストフィールドの文字数がこの限界回数を超えると「?」が返ります。
こちらの環境でのテストでは、テキストの文字数は「310」字位が限界です。
もし、310字以上の計算が必要なら、式の改修が必要です。
Last edited by Hiro (2019-08-10 04:57:52)
Offline
Hiro様
ありがとうございました。できました!
今回、当方で計算式の対象として扱っている文字数はせいぜい100文字程度ですので、上限310文字であれば問題なしです。
変数を設定 [ $txt; 値:Filter ( "abcdefghijknopqrstuvwxyz" ; テーブル::text ) ]
変数を設定 [ $n; 値:Length ( $txt ) ]
Loop
変数を設定 [ $txt; 値:
Let ( [
chr = Middle ( $txt ; $n ; 1 ) ;
chrs = Filter ( テーブル::text ; chr )
];
Replace ( $txt ; $n ; 1 ; chrs )
)]
Exit Loop If [
Let (
$n = $n - 1 ;
$n = 0
)]
End Loop
フィールド設定 [ テーブル::text; $txt ]
という動きも面白いでしょう。
Last edited by Shin (2019-08-11 14:40:31)
Offline
敢えてSortValues関数を使わない Shinさん>#10 Loopスクリプト案を ループ計算式化してみました。
(※ただし#10案はロジック的に、対象テキストはアルファベット半角小文字のみで固定化)
Let([
$txt=Filter("abcdefghijknopqrstuvwxyz"; テキストフィールド);
$n=Length($txt);
$fnc="Case($n=0; $txt; Let([#chr=Middle($txt; $n; 1); #chrs=Filter(テキストフィールド;#chr); $txt=Replace($txt;$n;1;#chrs); $n=$n-1]; Evaluate($fnc)))"
];
Evaluate($fnc)
)
Last edited by Hiro (2019-08-12 13:11:55)
Offline
Pages: 1
[ Generated in 0.009 seconds, 17 queries executed - Memory usage: 552.01 KiB (Peak: 572.55 KiB) ]