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

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

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

You are not logged in.

Announcement

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


#1 2016-02-29 14:19:30

eddie
Member

フィールド内容から特定の文字列を含む行を取り出す方法

いつもお世話になっております。FMP11 Mac 使用です。

HTMLファイルがMac/Windows上の特定のフォルダに入っています。

その内容には、

【顧客名】あいうえお株式会社

のような記載(行)があります。

ここから「あいうえお株式会社」だけを取り出して、「顧客名」フィールドに自動で入力したいのですが、どのような方法があるでしょうか。同業他社はAccessを用いてこの作業を自動化していて、弊社でも同様の処理をFileMakerでできないかという要望がありました。なお、項目は顧客名以外にも複数あり、同様に自動入力したいと考えています。

おそらく
1) HTMLの内容をまるまるFileMakerのフィールドにコピーする
2) 文字列を検索して行を特定し、行単位で取り出す
3) 項目名を削って必要な情報だけにする
という手順になると思われますが、1)及び2)については方法が見当もつかない段階です。

お知恵を拝借できれば幸いです。どうぞよろしくお願いいたします。

Last edited by eddie (2016-02-29 15:03:15)

Offline

#2 2016-02-29 16:30:43

Hiro
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

1)の手法案。
HTMLファイルをWebビューアに表示させ、それから目的のHTMLソースを取得する案例。

(回りくどいけど、4段論法による)
・元HTMLファイルをオブジェクト・フィールドへ「ファイルを挿入」で参照パス保存しておきます。
・それを「フィールド内容のエクスポート」で「共用の固定ファイル名」と「共用の固定出力先パス」を指定して書き出します。
・その共用固定ファイルパスをURL指定して、Webビューアを開きます。
・そのWebビューアから、「GetLayoutObjectAttribute("Webビューア名"; "content")」関数でHTMLソースを取得、結果を「フィールド設定」でフィールドへ代入します。

2)と3)については、対象を具体的に示してもらえないと、アドバイスしようがないかな、

Last edited by Hiro (2016-02-29 16:36:30)

Offline

#3 2016-02-29 17:25:52

Hiro
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

【追記】
2)については、「行」単位の切り出しが本当に有効な手段なのかの判断はおいといて、

取り敢えず、キーワードを含む行を切り出すカスタム関数式を記しておきます。

【 部分一致FilterValues(一覧;文字列) みたいな関数式 】
Let(
    #fwd="Let([#txt=\"";
    #mwd="\"];Case(Position(#txt;$key;1;1);#txt&\¶))&Let([#txt=\"";
    #bwd="\"];#txt)";
    #fnc=#fwd&Substitute("¶"&#lst&"¶";["¶";#mwd])&#bwd
];
    Let([#lst="改行区切りテキスト文"; $key="キーワード"]; Evaluate(#fnc))
)

Offline

#4 2016-03-01 11:44:27

eddie
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

Hiroさま
ありがとうございます!
私が考えていたよりもかなり高度な作業のようですね。。
教えていただいた内容をまだ試せていませんが、できる範囲でやってみます。
またわからない部分をご相談させていただくかもしれませんが、取り急ぎお礼を申し上げます。

Offline

#5 2021-05-09 05:31:29

eddie
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

かなり古い質問をいまさら引っ張りだしてすみません。。
この頃から比べると多少私の勉強も進み、このトピックに挑戦してみようと思うのですが、以下の箇所が理解できません。ご教示いただけないでしょうか。

質問1
Case(Position(#txt;$key;1;1))
について、#txtは何を引数に設定すればよいのでしょうか?XMLの内容全体だとすると、$keyが含まれるのは前提なので、評価は常に1となるのではないでしょうか?

キモとなる#fncの部分を具体的に書き出してみると、

Let ( [ #txt = "" ] ; #txt & ¶ ) & 
Let ( [ #txt = "#lst" ] ; #txt & ¶ ) & 
Let ( [ #txt = "" ] ; #txt )

となり、これは要するに

¶ & #lst & ¶

ということだと思うのですが、なぜこれで該当行のみが切り出せるのかが理解できません。。

質問2
#lstには何を引数に設定すればいいのでしょうか?XMLの内容全体だとすると、#txtと同じになってしまいます。


やりたいことは、XML中の

<abcpc:name>【顧客名】あいうえお株式会社</abcpc:name>

の行を切り出したい、となります。

よろしくお願いいたします。

追記:現在はVer 18 Pro Adv for Mac を使用しています。

Last edited by eddie (2021-05-09 06:56:51)

Offline

#6 2021-05-09 08:45:38

Shin
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

Let (
[
    txt = xml ;
    tar = "【顧客名】あいうえお株式会社" :
    pos = 1 
] ;
    GetValue ( txt ; ValueCount ( Left ( txt ; Position ( txt ; tar ; pos ) ) ) )
)

で行は取り出せます。ただ、前後のタグで区切って取り出さないと意味がないかも。
複数あるのでしたら、pos を変化させて再帰です。While が使えるので、簡単ですよ。

While (
[
    txt = xml ;
    tar = "【顧客名】あいうえお株式会社" :
    pos = PatterCount ( txt ; tar ) ;
    res = ""
] ;
    pos > 0
[
    res = List ( GetValue ( txt ; ValueCount ( Left ( txt ; Position ( txt ; tar ; pos ) ) ) ) ; res ) ;
    pos = pos - 1
] ;
    res
)

)

Last edited by Shin (2021-05-09 08:57:22)

Offline

#7 2021-05-09 08:50:13

himadanee
Guest

Re: フィールド内容から特定の文字列を含む行を取り出す方法

その計算式は「部分一致FilterValues」ですから、各行についてCaseで一致するかどうかの判定をしています。

「キモ」の解釈が間違ってます。¥を無視しないでよく考えてみてください。

元の質問(と回答)でも出てますが、HTMLやXMLのテキストノード内以外の改行(タグの前後の改行)は意味がないので、行単位で取り出すことは考えない方がいいです。必要なのは開始・終了タグの間の文字列ですよね。

#8 2021-05-09 09:26:16

eddie
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

Shinさん、ありがとうございます。
シンプルになり理解がだいぶ容易になりました。

今回はXMLファイルごとに「あいうえお株式会社」の部分が変わって、この値を取得したいので、これを変数に指定することはできないのですが、これを"<abcpc:name>"とすれば問題なさそうですね!

Offline

#9 2021-05-09 09:33:21

eddie
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

himadaneeさん、ありがとうございます。
相変わらず雑な理解しかできていないようで、お恥ずかしい限りです。。

himadanee wrote:

必要なのは開始・終了タグの間の文字列ですよね。

そのとおりなんです。
それぞれのPositionを計算して余計な部分を削る方針ならば私でもできそうな気がしています。

XMLを取り込む部分はまだ手つかずで、作業過程で改行が消えてしまった場合はShinさんの計算式が使えなくなってしまうので、この方法も引き続き考えてみます。

Offline

#10 2021-05-12 08:54:36

Shin
Member

Re: フィールド内容から特定の文字列を含む行を取り出す方法

単純に、直前後のタグを含めるだけなら、

Let (
[
    txt = xml ;
    tar = "【顧客名】あいうえお株式会社" ;
    pos = 1  ;
    p0 = Position ( txt ; "<" ; 1 ; PatternCount ( Left ( txt ; Position ( txt ; tar ; 1 ; pos ) )  ; "<" ) ) ;
    p1 = Position ( txt ; ">" ; p0 ; 2 + PatternCount ( tar ; ">" ) ) 
] ;
    Case ( p0 ; Middle ( txt ; p0 ; p1 - p0 + 1 ) )
)

Last edited by Shin (2021-05-12 16:07:47)

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.015 seconds, 7 queries executed - Memory usage: 542.98 KiB (Peak: 563.52 KiB) ]