FileMakerで改行区切りリスト(値一覧)からの抜粋
はじめに
今回ご紹介するのは、先日行われた「行抜きカスタム関数スピードコンテスト」
こちらで私の作成したカスタム関数の処理概要になります。どうしても他人のカスタム関数というのは、パッ見ただけでは処理が分かり辛いですよね...。そりゃあ普通、自分自身に分かるようにしかコードを書きませんから仕方ありません。ましてや、大会などでは体裁など二の次さんn......
ですので、
図を使ったりしながら出来る限り処理内容をお伝えすることで、今後みなさんのより良いアイデアに繋がればと思います。ぶっちゃけ大したことはやっていませんし、どんな値一覧でもこれが一番というわけではないです。あくまでも私の考え方になりますヨ。
本題
大会のお題はこれでした。
改行区切りリスト(いわゆる値一覧)からキーワードにマッチする行を抜粋する
これって、よくあるケースですよね。
特にFileMaker16でcURLが柔軟に使えるようになって以降、APIのレスポンスが長~いxmlデータだったりすると、必要なものだけ抜き出していくということが求められると思います。
おぃ、聞いてんのか楽天、キミのことd...
いゃau Pay君も、なに涼しい顔して27Mbyteとか巨大なxmlを返しt...
そんな時に役立つかもしれませんね?
ポイント1
キーワードがあるかないか、値一覧を1行目からループ回しながら(または再帰などで)舐めていくのが基本的な考え方になると思いますが、値一覧が数百数千行程度ならまだしも数万行となると、流石にFileMakerも重労働になってくるかと思います。時にはストライキを起こして無反応、かーらーの!強制終了...になるかもしれません。
そこで、
FileMakerにストライキを起こさせないようにする為に、まずこんな風にしました。
キーワードが「アース」の例
そもそも値一覧の中にキーワードは全部でいくつありますよ、と最初に教えてあげたのです。
つまり、全体像を把握させようZE!っていう算段です。やみくもに働かせるはイクナイ
こうすることで、キーワード数が全部で○○個と分かったとすれば、○○個見つかった時点でループなり再帰なりの仕事を終えれば良いことになります。やることやったら帰って遊ぼうぜってな感じですね。おーぃ磯野ー!やky
ところが一つ罠がありまして、全部で○○個と分かったとしても、キーワードを含む行が最終行にあったりすると...残業確定です。それを見つけるまで帰れまてん、かなC...
じゃあ、どうやってストライキ寸前のFileMakerを救ってあげるのか。
ポイント2
値一覧をいくつかのブロックに分割して働かせます。
キーワードが「アース」の例
分割するブロック数については後述しますが、こういう風に分割することで、キーワードを含まない行をブロック単位で飛ばすことができます。ブロック自体の作成は、MiddleValues
を使って抜き出しました。
良く見ると、これも結局はポイント1と同じ考え方になりまよね。ブロックに分割するとは言え、そのブロック毎に全体像(キーワードを含む数)をまず把握させる、そしてキーワードを含むブロックであれば、そのブロックの1行目から舐めていく。
ただ、ポイント1だけよりも、それを含んだポイント2の方が、FileMakerはより働きやすいことが感覚的にも分かると思います。ホワイト企業万歳!!
ポイント3
で、
肝心のブロック数(つまり分割数)はいくつが良いのか?ですが、ぶっちゃけ確たるナレッジはありません。2分割よりも3分割が良いのは間違いないですが、じゃあ5,000とかの分割がいいのか?というとそうでもなかったりらじばんだり。
それでも、色々試した上で敢えて言うとすれば、
値一覧に含まれるキーワードの行数とか、それらの行の離れ具合によるかなぁ?
というのが私の見解です。
えぇぇ...
っていうね。まぁそんなもんですよ、人生。
所詮、私達はClaris様の手のひらの上の孫悟空。
ただ私のカスタム関数は、こんな風に一旦ブロックに分割したものを、さらにいくつかのブロックに分割し、そしてそのブロックをJSON配列にしてJSONGetElement
関数で舐めながら抜き出していく、という処理を行っています。
分割⇒分割⇒JSON配列⇒JSONGetElement抜粋
ちなみに、JSON配列はこういうのですね。
[ "1012948|アーテック" , "1024582|アービン" , ..... , "1022199|アールト" ]
これを
JSONGetElement ( $arrayData ; "[" & $cnt & "]" )
ってな感じで、
配列番号$cnt
を「0」からカウントアップさせながら、抜き出した値をPosition
関数で判定
ヒットすれば、List
関数でヒットした配列値を改行区切りで作成、という流れです。
値一覧をブロックに分割して、さらに分割するまでの処理をWhile
関数で行い、JSON配列からJSONGetElement
関数で抜き出す処理を再帰で行っています。
処理全体像
おわりに
いかがだったでしょうか。
なるべくFileMakerに重労働をさせないように気を使った結果、上記のような処理に落ち着きました。ちなみにJSONを使っているのは単純に趣味です、趣味。JSONを使わない方がぶっちゃけ速いと思いますが、場合によってはJSONの方が意外に速かったり...?
興味を持たれ方は、探索アルゴリズムも読まれると面白いと思います。
もしもっと良い方法が作成できたら、ゼヒ教えて下さい。
それでは
Let's enjoy FileMaker!
Discussion