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

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

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

You are not logged in.

Announcement

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


#1 2022-12-20 18:01:45

ジョー
Guest

Whileの使い方

いつもお世話になっております。
下記のようにWhileで先頭五文字を消すロジックを書いたのですが一つしか消えませんでした。

環境:Mac、FM19

While (
[
a = 文字列フィールド;
b = 1;
結果 = ""
]
; b < 5;
[
結果 = Replace ( a ; b ; 1 ; "" );
b = b + 1
]
; 結果 )

一つしか消えない理由はなんとなく察し出来るのですがうまく言語化できません。
素人的質問で恐縮ですがご教授をお願い致します。

#2 2022-12-20 19:28:47

himadanee
Guest

Re: Whileの使い方

ループ中で消す位置は常に1文字目でないとだめなのでは。

「先頭五文字を消す」なら5文字をReplaceするだけでWhileの必要ないですけどね。

#3 2022-12-20 20:27:53

ジョー
Guest

Re: Whileの使い方

himadanee様、ご教授をありがとうございます。

>ループ中で消す位置は常に1文字目でないとだめなのでは。

なるほど。そういう仕組みなのですね。
私がやりたいことは

●●○○○●●●○●○●○●○●●○○●● で二つ以上連続する●を▲に変換したいです。

▲○○○▲○●○●○●○▲○○▲ が理想です。

これをWhileで実現するのは難しいでしょうか?
他に方法があればご教授をいただければ非常にありがたいです。

#4 2022-12-20 21:16:57

himadanee
Guest

Re: Whileの使い方

Whileでもできるでしょうけど、この場合特殊な操作なのでSubstituteでもできます。

Substitute(文字列フィールド;["●●";"▲"];["▲●";"▲"];["▲";Char(100002)];[Char(200001);""];[Char(100002);"▲"])

#5 2022-12-20 21:20:46

himadanee
Guest

Re: Whileの使い方

ところで「そういう仕組み」というか、
ABCDEF
の先頭1文字を消去すると
BCDEF
になりますから、次のループでBを消すのは2文字目でなくまた1文字目ということになります。
後ろから消すようにすれば、5文字目、4文字目~~ということになります。

#6 2022-12-21 11:32:29

ジョー
Guest

Re: Whileの使い方

himadanee様、ご教授をありがとうございます。
お教えいただいた
>Substitute(文字列フィールド;["●●";"▲"];["▲●";"▲"];["▲";Char(100002)];[Char(200001);""];[Char(100002);"▲"])
をWhileでも出来るようにする方法はございますでしょうか?

・やりたい事
¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥ 二文字以上連続する¥を一つに変換したい
¥ABCDE¥ABCDE¥ABCDE¥ 理想の処理

下記のコードでトライしてみましたがダメでした。Substituteで一回だけ¥¥から¥に変換できただけでした。
どこが悪いのか分からず悩んでいます。
WhileでABCDEFの先頭5文字を消去する処理も同様にダメでした。
どうかご教授の程を何卒宜しくお願い致します。

While (
[
count = 0;
res = ""
];
count <  ¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥の「¥」をPatterncountするフィールド
;
[
count = count + 1;
res = Substitute ( ¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥のあるフィールド ; "¥¥" ; "¥" )
]; res )

#7 2022-12-21 11:47:08

Shin
Member

Re: Whileの使い方

やりたいことが、ころころ変わっていますが。

> ¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥ 二文字以上連続する¥を一つに変換したい
ならば、
Substitute(文字列フィールド;["¥";Char(100002)];[Char(200001);""];[Char(100002);"¥"])
だけでいいですよ。
どうしても while が使いたいのでしたら、
While (
[
    t = フィールド
] ;
    PatternCount ( t ; "¥¥" ) ;
[
    t = Substitute ( t ; "¥¥" ; "¥" )
] ;
    t
)

> WhileでABCDEFの先頭5文字を消去する処理
Replace(文字列フィールド;1;5;"")
だけでいいですよ。
どうしても while が使いたいのでしたら、
While (
[
    t = フィールド ;
    i = 5
] ;
    i ;
[
    t = Replace ( t ; 1 ; 1 ; "" ) ;
    i = i - 1
] ;
    t
)

Last edited by Shin (2022-12-21 12:17:08)

Offline

#8 2022-12-21 13:28:50

ジョー
Guest

Re: Whileの使い方

Shin様ご教授をありがとうございます。
Whileの使い方を勉強中で、やりたいことがころころ変わってしまい申し訳ございません。
ご教授いただいた処理でいけました!
どうしてこの処理なのか分析して血肉とさせていただきます。

最後のご質問になりますが、どうして私のこの処理ではダメだったのでしょうか?
原因を知ることで一層の理解に役立てたく思っております。
恐らく条件設定が間違っていると推測しています。
>count <  ¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥の「¥」をPatterncountするフィールド
どうかご教授の程を何卒お願い致します。

While (
[
count = 0;
res = ""
];
count <  ¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥の「¥」をPatterncountするフィールド
;
[
count = count + 1;
res = Substitute ( ¥¥ABCDE¥¥¥ABCDE¥¥¥¥ABCDE¥¥¥¥¥のあるフィールド ; "¥¥" ; "¥" )
]; res )

#9 2022-12-21 13:36:56

himadanee
Guest

Re: Whileの使い方

count < フィールド
ではフィールド値とcountを比べてますから意味がわかりません。

Substituteはテキスト全体を一度に処理するので、countで回数指定のループをする意味はありません。
「¥¥がなくなるまで繰り返す」なので、この場合PatternCount の出番となります。

#10 2022-12-21 13:51:04

ジョー
Guest

Re: Whileの使い方

himadanee様ご教授をありがとうございます。

>count < フィールドではフィールド値とcountを比べてますから意味がわかりません。
>Substituteはテキスト全体を一度に処理するので、countで回数指定のループをする意味はありません。

この説明でようやく腑に落ちました。
フィールド値を条件設定に使うという初歩的なミスを犯して恥ずかしいです。
Substituteはテキスト全体を一度に処理する特性のために回数指定のループは意味がないと把握しました。

大変有意義なご知見をありがとうございました。深く感謝致します。
得られた知見を別の形で応用して活かします。

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 564.23 KiB (Peak: 579.54 KiB) ]