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

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

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

You are not logged in.

Announcement

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


#1 2020-02-10 12:27:05

ウィン
Member

文字列分解のアプローチ

治療の記述方法に省略文字(薬品名)と数字(投薬量)を記した入力をしています。

CO2VC2
ミ5コ2
グ2ロキ
など薬の省略カタカナ(薬品名)+数字(投薬量)を示しています。中には末尾に数字か記述されていないものがあります。

省略の内容を知るためのマスタデータ、コードで記された薬品名や施工単位など、参照するためのマスタデータはしっかり作ってあります。
投薬量が変化したり、薬品が追加されたりするので、カタカナと数字、英単語と数字と言ったような2つのワードで抜き出せば簡単かと思っていました。ですが連なった英数字やカタカナの入り方が変化すると上手く分類できなくなってしまいました。スペースやカンマ、句読点で区切ったとしても英数字は1ワードと見なされ、並びが変わったりしてしまいました。

問題はこの分解にあります。一応メインのフィールドから、下記のように各々に一旦分解をして、省略カタカナは薬品マスタから参照し、数字は薬品投薬施工量を乗算して出力しようといました。ですが分解が綺麗におこなわれないのです。

単語1 MiddleWords ( 静脈注射 ; 1 ; 2 )
単語2 MiddleWords ( 静脈注射 ; 3 ; 2 )
単語3 MiddleWords ( 静脈注射 ; 5 ; 2 )
単語4 MiddleWords ( 静脈注射 ; 7 ; 2 )

連なった文字列の分解法がありましたら教えていただけませんか?よろしくお願いいたします。

FMA18
FMS18

Last edited by ウィン (2020-02-10 12:31:56)

Offline

#2 2020-02-10 13:43:20

Shin
Member

Re: 文字列分解のアプローチ

省略内容のマスターデータをみないと、なんともできません。
COに対して、COAがあったりすると、処理が変わります。
どちらにしても、先頭の1文字をみて、マスターデータに該当があるか、複数ならば先頭2文字で該当があるか、... と繰り返し、該当が1個に絞り込めた時点で、それに続く数字を抜き出して、次の文字に、、、という繰り返しです。
単純な計算式では不可能でしょう。

Offline

#3 2020-02-10 14:14:57

ウィン
Member

Re: 文字列分解のアプローチ

機械は絶対的命令の元に動いているので、処理計算させる為にはしっかりしたロジックか法則でデータ入力する必要がありますよね…

もしも、先頭から3桁までが数字であれば、3桁を抜き出し、1桁だった場合数字以降ABCは読まないようにすることは出来ますか?

123ABC345DEF 3桁だった場合→123
23ABC456DEF 2桁だった場合→23
3ABC456DEF 1桁だった場合→3

Offline

#4 2020-02-10 14:30:30

qb_dp
Member

Re: 文字列分解のアプローチ

省略の内容を知るためのマスタデータ、コードで記された薬品名や施工単位など、参照するためのマスタデータはしっかり作ってあります。

チョット疑問なのですが、フィールド:静脈注射 があるレコード・テーブルとマスタデータは、関連付いていないのでしょうか?
私は医療関係でないので分からないですが、薬品を患者にどれだけ投薬するかをキッチリデータベースで確認したい場合、

投薬テーブル?(ポータル表示)
[投薬分類?][薬品名][投薬量]
(1)静脈注射, 薬品名1, 2
(2)静脈注射, 薬品名2, 5
(3)◯◯注射, 薬品名3, 3

[薬品名]は、マスタデータのコードで管理・関連付け。

の様な設計が必要なのでは。
※医療関係者ではないので的外れでしたら流してください。

Offline

#5 2020-02-10 14:37:38

チポ
Member

Re: 文字列分解のアプローチ

> 先頭から3桁までが数字であれば、3桁を抜き出し、1桁だった場合数字以降ABCは読まないようにする
これへの回答です。

2A3
の様な
数字、文字、数字
がなければ、
無条件に左から3文字とりだし、その数字のみを抜き出す。

でいいですが、いかがでしょう?

Offline

#6 2020-02-10 15:45:11

ウィン
Member

Re: 文字列分解のアプローチ

無条件3文字ではなく
2A3の場合 「2」を取り出したいのです。それをコード「002」と参照させたいのです。
一応の基本法則として、文字+数字がワンセットで入力します。

123ABC456DEFとわかりづらかったと思うので詳しく説明します。ファイルはマスタデータ含めて4種類になります。各々にコード番号がふられており、コードからの詳細情報の参照は可能になっています。

※1.先頭3桁の数字までは技術料
※2.次にくる文字は薬品名、これはカタカナかアルファベットです。
※3.薬品名直後に付く数字は投薬量(投薬単位)
※4.追加投薬がある場合、末尾から書き足していく。
※5.薬品によって末尾に数字(投薬量)が記入されないので、理想は記入がなければ1とカウントしたい、無理であれば数字1を書き足してもらう予定。

カルテ(メインファイル)

先頭から3桁までの数字
技術料マスタ(最大3桁までのコードと詳細情報)

省略文字マスタ((一例)バ、ハ、パ、ヒ、フェ、ヘスパンダー、ベト、マルボ、ミ、ミノペン、ラ、フル、ラボ、ケト、ロキ、MSM、OTC、DA、Co)
省略文字直後に付く数字は投薬単位、投薬単位は治療内容によって変化
6グ2ロキ(006技術料+グルコサミン2個+ロキシーン1個)※5.カウントの付け足しが出来なければ「6グ2ロキ1」と記入してもらう。

薬品マスタ
省略文字の薬品情報と施工単位、施工単位に投薬単位を乗算

本来なら仮想リストかドロップダウンで薬品を選択してもらい、投薬単位を入力してもらえば早い話なのですが、手書きカルテで何年も記入してきた省略文字で書かせてあげて、それが自動的に薬品と施工単位が入るようにしてあげたいのです。選択させる一連の入力法ではカルテ入力に時間が掛かってしまい次の治療馬の診察までの時間が勿体ないのです。時短の為に何とかして馴染みのある記述で何とかならないか模索しています。

先頭3桁は治療内容とは別のフィールドに入力してもらえば、一手間省けるので、薬品とその単価さえ上手く切り出せれば、あとは楽なのですが・・・

Last edited by ウィン (2020-02-10 15:49:05)

Offline

#7 2020-02-10 15:48:47

Hiro
Member

Re: 文字列分解のアプローチ

一般論として、
複雑な文字列解析にFM標準テキスト関数は非常に非力です。
強力な文字列解析には「 正規表現 」プラグインで機能補足するのが、最善策かも?

Offline

#8 2020-02-10 15:52:57

ウィン
Member

Re: 文字列分解のアプローチ

カルテはiPadPROを用いてGoから手書き入力アプリを介してペンタブ入力する予定です。
スペース区切りは入力時間にラグがあるので、句読点かカンマで区切らせようかとも思っています。
区切りをつけてあげれば何とかなりますかね?

Offline

#9 2020-02-10 16:08:02

ウィン
Member

Re: 文字列分解のアプローチ

プラグインなどで補足機能をあげた場合、プラグインがインストールされているマシンでしか力を発揮しませんよね?

Offline

#10 2020-02-10 16:42:55

チポ
Member

Re: 文字列分解のアプローチ

2A3
これへの対応計算式です。
3桁ですからベタベタに並べます。

Let ( [ c1= Left ( テキスト ; 1 ) ;
          c2 = Middle ( テキスト ; 2 ; 1 ) ;
          c3 = Middle ( テキスト ; 3 ; 1 ) ;
          n = "0123456789" ] ;
Case ( not IsEmpty ( Filter ( c1 ; n ) ) ;  c1 &
Case ( not IsEmpty ( Filter ( c2 ; n )  ) ; c2 &
Case ( not IsEmpty ( Filter ( c3 ; n )  ) ; c3 ) ) ) )

Offline

#11 2020-02-10 16:45:18

Shin
Member

Re: 文字列分解のアプローチ

正規表現でも無理でしょう。
ほぼ分解できるサンプルはできました。ただ、省略文字に完全には対応はできていないかも。例えば、グロという省略があり、6グロキ(006技術料+グルコサミン1個+ロキシーン1個)と書かれたときに、グロキを人が見れば、グ・ロキとみるかもしれませんが、単純な分解ではグロ・キとみてしまい、どうしようもありません。

Last edited by Shin (2020-02-12 16:14:02)

Offline

#12 2020-02-10 17:08:27

ウィン
Member

Re: 文字列分解のアプローチ

ありがとうございます!
この二つのテクニックを使ってチャレンジしてみたいと思います。

マスタデータのカスタマイズと分解された結果を見てみたいと思います。

Offline

#13 2020-02-10 17:12:12

ウィン
Member

Re: 文字列分解のアプローチ

省略コード一覧と薬品リストは一緒にしてしまった方がいいですか?

Offline

#14 2020-02-10 17:43:40

ウィン
Member

Re: 文字列分解のアプローチ

サンプルありがとうございます。
サンプルのマスタにいくつかの省略文字と薬品名を入れて動作させていました。
マスタデータをしっかりさせれば、要件は満たされる感じがします。

Offline

#15 2020-02-10 18:12:06

ウィン
Member

Re: 文字列分解のアプローチ

>単純な分解ではグロ・キとみてしまい、どうしようもありません。
グロキで入力されるパターンはないので大丈夫だと思います。
「グ1ロキ」や「ロキ1グ1」があったとしても省略薬品名を繋げて書かないと思います。
最低限の入力ルールを守ってもらうようにすれば、かなりの機能を発揮してくれると思います。

Offline

#16 2020-02-11 11:16:20

Shin
Member

Re: 文字列分解のアプローチ

> 「グ1ロキ」や「ロキ1グ1」があったとしても省略薬品名を繋げて書かないと思います。
それが守れれば、省略に数字を含まないという前提で、数字を全て改行に置き換えれば、省略文字列のリストができます。単純に行うには、そのリストの項目を、明細に設定しておけばいいでしょう。

規則外れを一応考えて、ミ、ミノペンのような省略があるので、キーは長い方から短くして検索していかないとダメですね。修正しています。
https://www.dropbox.com/s/v2y7h45wluoe8 … 2.zip?dl=0

Last edited by Shin (2020-02-17 04:13:53)

Offline

#17 2020-02-11 14:43:55

ウィン
Member

Re: 文字列分解のアプローチ

非常に助かりました。また技術料の追加もありがとうございます。
ペンタブ入力によるテストがまだ行えていないのですが、区切りの想定に、半角全角数字、半角全角スペースが例外的に入った場合の対処もできますか?
半角全角数字の場合の対処で頂いたスクリプトで試してみました。Filterに"1234567890"に"12345678901234567890"全角数字を足したら一応正常動作したのですがどうなんでしょう?
規則外れは開発側の想定を大きく超えてくると想定していますw

Offline

#18 2020-02-11 15:12:12

Shin
Member

Re: 文字列分解のアプローチ

> 区切りの想定に、半角全角数字、半角全角スペースが例外的に入った場合の対処もできますか?
TrimAll() と RomanHankaku() を最初に使っておけばいいでしょう。

Offline

#19 2020-02-11 20:35:18

ウィン
Member

Re: 文字列分解のアプローチ

win
お陰様で比較的長いものも分解されて正確に表示される様になりました。

新たな課題が出てきてしまいました。
技術料コード最大3桁は特に問題はなく動作しました。
ところが略称の頭に技術料コードが記入されない記述もあり、伺ったところ、特定の略称は固定された技術料があるそうです。

本来なら
技術料コード(最大3桁) & 略称 & 数量 & 略称 & 数量 & 略称 & 数量....etc
っといった具合でした。

技術料コードが記載されていない特定の略称は技術料コードが固定されています。

分解された自動入力と固定された技術料コードは混在させることは出来るのでしょうか?
http://frds.html.xdomain.jp/fmp/fm-aid10158V2.fmp12
テーブル名は変更されています。
薬品リストに全薬品名と略称、固定コードが入っています。

お手数おかけしますがよろしくお願いいたします。

Offline

#20 2020-02-12 08:10:01

ウィン
Member

Re: 文字列分解のアプローチ

頭の技術料コードが空の場合、予め決めている固定コードの値を入れ、頭に最大3桁の技術料コードが入力されている場合は入力されたコードを入れればいいわけですよね。

IsImpty()とCase()を使えば良いと思うのですが、サンプル内のスクリプトとどお繋げていったら良いのか悩んでます。

技術料計算フィールド
Right (
    "000"
     & Case (
        Left ( 静脈注射 ; 3 ) = Filter ( Left ( 静脈注射 ; 3 ) ; "0123456789" ) ; Left ( 静脈注射 ; 3 ) ;
        Left ( 静脈注射 ; 2 ) = Filter ( Left ( 静脈注射 ; 2 ) ; "0123456789" ) ; Left ( 静脈注射 ; 2 ) ;
        Left ( 静脈注射 ; 1 )
    ) ;
    3
)

このスクリプトをLet()で一旦変数に置き換えてから値の有無を判定して固定コードを呼び出すのか。
IsImpty()に入れ込んでしまうのか…今のままだと「ロキ」と入力すると「00ロ」と値が返ってくるので空の判定ではなくなるんですよね。

3桁目が数字でなかった場合を空であると判定させるようにすればいいのかな

ごめんなさい 分かりません。ご教示お願い致します。

Offline

#21 2020-02-12 10:39:57

Hiro
Member

Re: 文字列分解のアプローチ

流れは理解していませんが、
こんなこと?

Case(
   IsEmpty ( Filter ( Left ( 静脈注射 ; 1 ) ; "0123456789" ) )
   ; "デフォルト固定コード"
   ; Right (
         "000"
         & Case (
               Left ( 静脈注射 ; 3 ) = Filter ( Left ( 静脈注射 ; 3 ) ; "0123456789" ) ; Left ( 静脈注射 ; 3 ) ;
               Left ( 静脈注射 ; 2 ) = Filter ( Left ( 静脈注射 ; 2 ) ; "0123456789" ) ; Left ( 静脈注射 ; 2 ) ;
               Left ( 静脈注射 ; 1 )
            )
         ; 3 )
)

Last edited by Hiro (2020-02-12 10:43:32)

Offline

#22 2020-02-12 12:03:12

Shin
Member

Re: 文字列分解のアプローチ

べたに書いて、
Right (
    "000"
     & Case (
        Left ( テキスト ; 3 ) = Filter ( Left ( テキスト ; 3 ) ; "0123456789" ) ; Left ( テキスト ; 3 ) ;
        Left ( テキスト ; 2 ) = Filter ( Left ( テキスト ; 2 ) ; "0123456789" ) ; Left ( テキスト ; 2 ) ;
        Left ( テキスト ; 1 ) = Filter ( Left ( テキスト ; 1 ) ; "0123456789" ) ; Left ( テキスト ; 1 ) ;
        ""
    ) ;
    3
)
でもいいでしょうが。

Let (
[
    tx4 = Left ( テーブル::テキスト ; 4 ) ;
    tar = Left (
            Substitute (
                tx4 ;
                ["0" ; ""];["1" ; ""];["2" ; ""];["3" ; ""];["4" ; ""];["5" ; ""];["6" ; ""];["7" ; ""];["8" ; ""];["9" ; ""]
            ) ;
            1
        ) ;
    pos = Position ( tx4 ; tar ; 1 ; 1 )
] ;
    Right ( "000" & Left ( テーブル::テキスト ; pos - 1 ) ; 3 )
)
の方がスマートかな。逆Filter() が標準であればスマートなんですが。(カスタム関数で作れます)
https://www.dropbox.com/s/v2y7h45wluoe8 … 2.zip?dl=0

Last edited by Shin (2020-02-17 04:14:16)

Offline

#23 2020-02-12 12:14:19

ウィン
Member

Re: 文字列分解のアプローチ

固定技術料(デフォルト固定コード)は薬品リスト(マスターデータ)に固定技術料として略称と一緒にフィールドに記載されています。
1つの完全固定コードではなく、薬品の種類によって投薬部位が変わるため、技術料も変化します。

静脈注射、略称の頭に数字が入力されている場合
技術料コード + 略称 + 投与量


静脈注射、略称の頭に数字が入力されていない場合
変動(固定)技術料コード + 略称 + 投与量

見えていない部分(薬品リストから固定技術料を参照)

Offline

#24 2020-02-12 14:10:41

Shin
Member

Re: 文字列分解のアプローチ

1個の + 略称 + 投与量 + 略称 + 投与量... に複数の技術料が相当しない場合は、データの設定部分の loop 中で、フィールド設定 を使って設定すればいいです。
ということは、最初の技術料は無視してもいい、ということになりますが、矛盾はでませんか。

Last edited by Shin (2020-02-13 16:25:27)

Offline

#25 2020-02-12 15:59:58

ウィン
Member

Re: 文字列分解のアプローチ

略称の頭に最大3桁の数字が入力があったときはそれに従い、頭に入力がなければ、マスターデータに記録されている略称データ内の複数種類ある固定コードを参照したい次第です。
最初の技術料は無視されるのは困ってしまいます。

逆に薬品投与の各々にデフォルト値が決まっており、頭に数字の入力があった場合にはそれに従ってもらえば、コード参照で技術料の割り出しが出来ると思っています。

略称頭に入力があった場合
123CO → 123(技術料コード)

略称頭に入力がなかった場合
CO → 10(デフォルト値)薬品リストから参照

何度も手間をかけさせてしまって本当にすいません。
そんなアプローチがあったのかといつも感心させられます。自分なりには一生懸命考えているのが考えが及ばないことに憤りを感じたりもします。

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

Offline

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

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.040 seconds, 7 queries executed - Memory usage: 587.84 KiB (Peak: 624.74 KiB) ]