みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
フィールド内の先頭や末尾、途中に無駄に出来てしまった改行を削除するような関数はあるでしょうか?
無駄な改行とは次のような感じです。
[改行]
りんご
[改行]
[改行]
みかん
いちご
[改行]
以下のようなスクリプトを考えましたが、何かまどろっこしく、実は一発で変換できる関数があるのではと思った次第です。
よろしくお願いします。
変数を設定[$text; 値:""]
変数を設定[$n; 値:1]
Loop
Exit Loop If[$n > ValueCount(フィールド)]
If[Length(MiddleValues(フィールド;$n;1))>1]
変数を設定[$text; 値:$text & MiddleValues(フィールド;$n;1)]
End If
変数を設定[$n; 値$n+1]
End Loop
フィールド設定[フィールド; Left($text;Length($text)-1)]
当方の環境を書き忘れました。
Filemaker Pro 12 (Windows)です。
多分、リストの行数が260位までならいける式、
Let([
$lst=フィールド;
$i=0;
$res="";
$fnc="Case(
$i=ValueCount($lst); $res;
Let([$i=$i+1;$res=List($res;GetValue($lst;$i))]; Evaluate($fnc))
)"
];
Evaluate($fnc)
)
Offline
Hiroさんありがとうございます。
Let、Evaluateでやる方がきれいですね。
無駄な改行が増殖することがあり、知らないオリジナル関数で削除できるかもと思いましたがなさそうです。
List関数を使う方法は思いつきませんでした。
勉強になりました。
1発ではないけど分かりやすいのは
計算フィールド=GetValue (そのフィールド[1] ; Get (計算式繰り返し位置番号) )
を作って(レイアウトに無くてもいい)繰り返し設定を100位にしておけば
List(この計算フィールド)という計算式で全置換とかしてもいいかも。
Offline
ありがとうございます。HiroさんのListの役割を勘違いしていましたが、値の結合に利用しているのですね。
ヘルプを見て、「<フィールド> 内の空白を除く値の連結一覧を改行で区切って返します。」と書いてあるので
空白(=改行だけの行)を無視して返してくれると思いましたが、しっかり残って返ってきます・・・。
繰り返しフィールドじゃないとダメなようでした。
改行が2個以上続いてたら1個に変換する
Let ( [
$f="Case(PatternCount($s;\¶&\¶);Let($s=Substitute($s;\¶&\¶;\¶);Evaluate($f));$s)" ;
$s=t
];
Evaluate ( $f )
)
先頭と末尾は1個は残るので、別途処理が必要
Offline
先頭と末尾は1個は残るので、別途処理が必要
えっ!先頭と末尾残ってもいいんだったら、
Substitute ( テキスト ; [ "¶¶" ; "¶" ] ; [ "¶¶" ; "¶" ] )
でよくない?
皆様ありがとうございます。
当方の実用的には、空白の連続は2個まででなので、とおりすがりさんの方法でも問題ありません。
一般性を考えるとwaderさんのやり方は参考になりました。
どの方法も素晴らしい方法で勉強になりました。
元々はズボラなインポートとスクリプトでのデータ追加の際に空行が出来ることが多いので、
最初からその処理も行っておこうと思います。
一旦解決とさせていただきます。ありがとうございました。
連続が2個までと決まってるなら、置換も1回でいいですよね。
Substitute ( テキスト ; [ "¶¶" ; "¶" ] )
2回かけば4個まで。
私のは、再帰で1回毎に半分にするから、再帰限界が200なら2^200個連続してても1個にできるはず。テキストフィールドが10億文字(約2^30)までなので、事実上無制限。
Offline
Pages: 1
[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 517.79 KiB (Peak: 522.33 KiB) ]