FileMakerPro7 ファイルパスからフォルダ名を計算する

ファイルメーカーpro7では画像を扱う機能が強化されている。例えば画像ファイルを取り込んでも処理が重くならず表示速度が速くなりしかも扱えるデータサイズも現在の一般的なHDDの容量をはるかに超えていて8テラバイトもあり、実用上制限が無い位と言って良いほどである。


ファイルメーカーpro7では、画像を表示をするのに画像のパスを参照するやりかただとネットワーク上で他のコンピューターで開いても画像が表示できないのだが、ファイルに取り込むことで画像表示が可能となり画像データベースをネットワークでの共有もやりやすくなった。もちろんファイルメーカーpro6でも同様なのだがこのようにファイルに画像を取り込むと極端に動作が遅くなり全然実用的ではなかった。


さて、データベースに実際に画像を取り込んでもそのままではその画像をめくって見るだけなのだが、その画像についての文字情報があることにより素早くその画像を検索し利用をすることがが可能になる。しかしこの文字入力は一レコードづつの入力であるとずいぶん手間がかかる。しかも何千枚何万枚もの入力を考えるとちょっと気が重くなる。


そこで大分類の部分はファイルメーカーproにフォルダ名から計算させて文字入力を自動化してしまおうというのが今回のテーマである。これにより同じ時に取り込んだグループに自動で文字で分類することもできてデータの使い回しの利便性が格段に良くなる。また、画像に文字情報が加わることにより新しい切り口ができることになる。


なお、中分類つまりフォルダの中のフォルダ名の文字列の取り出し方は以下のやり方が理解できると同様に可能であるので省略する。




.


ファイルメーカーpro7やファイルメーカーpro6は、写真を取り込んだときにファイルの位置情報を文字で示す「ファイルパス」も取り込みができる。


例えばこんな感じなのだが


file://Macintosh
HD/Users/tarosuke/Pictures/写真フォルダ/2001.10.7/DSCN0940.JPG


このパスの文字列を説明すると「Macintosh
HD」のユーザーフォルダ「tarosuke」の「ピクチャ」フォルダの「写真フォルダ」の「2001.10.7」フォルダに「DSCN0940.JPG」というファイルがあるということなのだが、この中の「2001.10.7」が今回のターゲットとなり計算で取り出す文字列である。


早速取り掛かると、ファイルパスの文字列


「file://Macintosh
HD/Users/tarosuke/Pictures/写真フォルダ/2001.10.7/DSCN0940.JPG」からまず「ファイルの場所」のパスを計算する。


この中の一番最後の「/」の前の文字列「2001.10.7」がフォルダ名なのでこの一番最後の「/」が何文字目かを計算式


Left(ファイルパス; Position(ファイルパス; "/"; 1;
PatternCount(ファイルパス; "/")))


で画像ファイルの場所の前の文字列つまり「ファイルの場所」のパス


「file://Macintosh
HD/Users/tarosuke/Pictures/写真フォルダ/2001.10.7/」


が取り出しされる。そのあとにこの文字列から次の計算式


Middle(ファイルの場所, 先頭文字位置計算,文字数)


で「フォルダ名/」つまり「テキスト/」でこの場合は「2001.10.7/」を取り出す。なお、この式の「先頭文字位置計算」は


Position(ファイルの場所, 検索テキスト, 1, 1) +
文字位置調整


という計算式でこの中の「検索テキスト」は下から二番目のフォルダ名「写真フォルダ」である。「文字位置調整」は画像の入ったフォルダ名を取り出すときに数値を入力することによりその数値分の文字数をずらして正確に文字列を取り出すための調整ができる数値フィールドである。この例では自動的に「7」が入るように定義してある。


「文字数」はフォルダ名の最大文字数で大体20文字位にするのだが数値フィールドを定義しておいて自動で「20」が入るようにしておくと後で自由に変えることができる。


さらにこの計算した結果のテキスト「2001.10.7/」の最後の文字「/」を除くために計算式


Left(テキスト; Length(テキスト)-1)


で「2001.10.7」というフォルダ名を抽出する。


ところで、実際にこの画像データベースを使っているうちに取り込む写真のフォルダの位置が一定の場所以外から取り込みたいときもありこうなるとファイルのパスが変わってしまい対応できる必要がある。そのために準備したのが先の「検索テキスト」フィールドで普段は新規レコードを作成したときに自動的に「写真フォルダ」というテキストが入るようにしておき取り込みフォルダを変えたときはそのフォルダ名を「検索テキスト」フォルダに入力してその取り込みレコード数分を新しいフォルダ名に置き換えることにより下の階層の画像フォルダ名を半自動で正しく計算することが可能となる。


以上を一行の式に記述すると


Left(Middle(Left(ファイルパス;
Position(ファイルパス; "/"; 1;
PatternCount(ファイルパス; "/")));
Position(ファイルの場所; 検索テキスト; 1; 1) +
文字位置調整;文字数); Length(Middle(Left(ファイルパス;
Position(ファイルパス; "/"; 1;
PatternCount(ファイルパス; "/")));
Position(Left(ファイルパス; Position(ファイルパス;
"/"; 1; PatternCount(ファイルパス; "/")));
検索テキスト; 1; 1) + 文字位置調整;文字数))-1)


となる。


定義するフィールドは、以上のことから検索テキスト(テキスト)、文字位置調整(数値)、文字数(数値)、フォルダ名(計算)の四つでOK。





常に同じ階層のフォルダの写真フォルダから取込むだけならもっと簡単な式でも良かったのだが、別の環境で画像を取込んだりする場合でも簡単に対応できるようにするために「検索テキスト」フィールドを設けた。

さらにこの「フォルダ名」計算フィールドと「文字位置調整」フィールドを複製して取り出す文字位置をずらして細分化したテキスト情報も取りだしてより細かなテキスト検索が出来るように考えたのだが、ちょっと解析や分解が「?」な式ができてしまった。


他にもこの「フォルダ名」をテキストフィールドにして計算結果を取込むときに自動で入るようにするのであれば「検索テキスト」フィールドをグローバルフィールドにすると環境が変わったときにその写真の入っている下から二番目のフォルダ名にして取込む利用の仕方であれば取込むマシンが変わっても一手間だけで済むだろう。


下から二番目の画像フォルダを「デジカメde同時プリント」の「Roles」フォルダにしてしまえば画像ファイル管理と画像調整の両立が可能となりそれぞれの長所を生かして等々・・・(^^)。


う〜ん、自分の覚書き用に書いたのだが、これで必要が生じたときに後からでもこの内容を思い出せる?




何だか、解ったような意味不明のような???


さて、珈琲でも飲んでクリスマス・オラトリオを流してボーっとしよう。