テキストファイルの作成や削除、編集、名前の変更が出来るようになりました。
それらの機能追加として、下記のスクリプトと関数が追加されています。
ファイルの存在を取得
ファイルサイズを取得
ファイルの名前変更
ファイルを削除
データファイルを作成
データファイルを開く
データファイルを閉じる
データファイルに書き込む
データファイルの位置を取得
データファイルの位置を設定
データファイルから読み取る
Get (オープンデータファイル情報)
追加されたスクリプトステップ、関数の解説
1.ファイルの存在を取得
引数にファイルパスを指定して、ファイルが存在するか判定出来る。ファイルパスに2行指定した場合は1行目しか有効でない。存在する場合は1、存在しない場合は0をターゲットに返します。
2.ファイルサイズを取得
ファイルサイズをバイト単位で取得します。
今までも下記関数を使うことでファイルサイズを取得することは出来ました。
GetContainerAttribute ( ファイル ; "fileSize" )
しかし、一度オブジェクトフィールドへ入れる必要があったので、外部にあるファイルのサイズを取得できるのは意義があると思います。
3.ファイルの名前変更
ファイルの名前を変更出来ます。
例えば「log.txt」というファイルにログデータを書き込んでいて、一定サイズを超えたら「log2019-05-06.txt」というファイル名にして、アーカイブするという使い方が出来ます。
4.ファイルを削除
ファイルを削除します。
パスを指定することで、ファイルを削除することが出来ます。今までもフィールドを指定せずに「フィールド内容のエクスポート」ステップを実行することで実現出来ましたが、、、解りやすくなりましたね。
5.データファイルを作成
空っぽのテキストファイルを作成します。
パスを2行書いても、1行目しか作成されません。
6.データファイルを開く
ここから少し独特な操作になります。
作成したデータファイルを操作するには、まずファイルIDを取得する必要があります。このファイルIDとはこのスクリプトを実行することで振られる番号のことです。同じファイルであっても、「データファイル閉じる」スクリプトステップを実行することで新たな番号が振られます。FileMaker Pro Advanced を再起動するとリセットされます。
また、開いている間のファイルは「ファイルの名前変更」「ファイルを削除」のスクリプトステップが実行できません。エラー300を返します。
7.データファイルを閉じる
ファイルIDを指定してデータファイルを閉じることが出来ます。例えば、ファイルIDが[35]のファイルを閉じた後に、同じデータファイルを開くと[36]になります。
FileMaker Pro Advanced を再起動して、同じファイルを開くとファイルIDは[1]となります。
8.データファイルに書き込む
このスクリプトは「データファイルを開く」スクリプトステップでファイルIDを取得してからでないと使えません。
文字コードは下記のどちらか。
UTF-8
UTF-16
書き込んだ文字列の最後に改行を追加するかどうかをオプションとして設定出来ます。最後に改行を追加すると、ログを改行区切りで残していく様な使い方が出来ます。
9.データファイルの位置を取得
このスクリプトもファイルIDを取得している必要があります。このスクリプトによって、次に書き込む位置を取得することが出来ます。
例えば、改行を追加せずに「ABC」と書き込んだ後でこのスクリプトを実行すると、「3」を返します。
次に、ファイルを閉じて、もう一度開いてこのスクリプトを実行すると「0」を返します。つまり、この状態で書き込みをすると先頭文字列を上書きしてしまうのです。
※「データファイルに書き込む」「データファイルから読み取る」を実行した後だと、「3」を返します。
ファイルを閉じて、データファイルに追記する場合は注意が必要です。
10.データファイルの位置を設定
データファイルへの位置を設定します。
イメージ的にはテキストファイルのカーソル位置を指定します。そのカーソル位置を起点に書き込んだり読み込んだりします。
下記スクリプトステップに影響する設定です。
データファイルに書き込む
データファイルから読み取る
「データファイルの位置を取得」で説明しましたが、データファイルを閉じて開くと、書き込み位置が0になってしまいます。
よって、データファイルに追記する場合は「ファイルサイズを取得」スクリプトステップでファイルサイズを取得し、その値を「データファイルの位置を設定」スクリプトステップで指定すると、一番最後に追記する形で書き込みすることが出来ます。
具体的には下記のようなスクリプトステップになります。
11.データファイルから読み取る
データファイルから中のテキストを読み込むことが出来ます。
読み取る形式として、下記があります。
UTF-16
UTF-8
バイト
「バイト」のみ戻り値がオブジェクトデータとなっていて、テキストファイル自体が入ります。「バイト」の場合、中のテキストを確認する場合はTextDecode関数を使います。
「サイズ(バイト)」オプションは[UTF-16]の場合と[UTF-8][バイト]で異なります。
[UTF-16]の場合は文字数
[UTF-8][バイト]の場合はバイト数
となります。このオプションを指定しない場合は全て読み取ります。
これら機能を使って、巨大なテキストファイルの一部分だけど読み込むという事が実現できます。最大64MBを一度に読みことが出来、32KB以下の場合に最大のパフォーマンスを出す事が出来るそうです。
[UTF-8]の場合
データファイルに「ABCあい😅」(最後に絵文字が入っています)というテキストが入ってた場合、
最初から3バイト取得すると「ABC」を返します。
次の3バイトを取得すると「あ」を返します。
次の3バイトを取得すると「い」を返します。
次の3バイトを取得すると、返ってきません。
要は、文字によってバイト数が異なります。日本語は大体は3バイトだそうですが、絵文字が入ると計算が狂います。固定長以外のファイルに対しては気をつけた方が良さそうです。
[UTF-16]の場合
データファイルに「ABCあい😅」(最後に絵文字が入っています)というテキストが入ってた場合、
UTF-16の場合はUnicode単位で読み込めますので、
最初から1単位で取得すると「A」を返します。
次の1単位を取得すると「B」を返します。
次の1単位を取得すると「C」を返します。
次の1単位を取得すると「あ」を返します。
次の1単位を取得すると「い」を返します。
次の1単位を取得すると、返ってきません。
絵文字部分は2つのUnicodeセットで表現するので、1文字1単位ではなく、2単位です。
この様に1文字を表現するコードが可変なので、データファイルから文字を切り取るにはこの様な想定をする必要があります。
UTF-8またはUTF-16のファイルから読み取るときは、全て読み込んだ方が安全とヘルプに書かれています。この新機能の検証をしている時に、文字コードをあえて無視したテストを行っている時にFileMaker Pro Advancedが落ちる現象に何度も遭遇しています。
12.Get (オープンデータファイル情報)
取得関数で、開いているデータファイルがある場合は下記のように返します。
35 file:/Macintosh HD/Users/sago/Desktop/test.txt
36 file:/Macintosh HD/Users/sago/Desktop/test2
一番左の数字がファイルIDで、その後に続く文字列がファイルパスとなっています。
このテキストを使うことで全てのファイルを閉じる処理を作ることが出来ます。
まとめ
UTF-16で作成したデータファイルがテキストエディタで開かない場合は、「UTF-16LE」を選択して下さい。
文字コードは非常にややこしく、成り立ちを追っていくと多くの人が苦労されています。英語圏の方にとっては漢字の扱いは身近ではなく、普段扱わない文字の扱いでのバグが生まれてしまうのがよく解りました。しかし、iPhoneで採用された絵文字がその様な文字コードのバグを無くしていっているという話は興味深いです。
データファイルの使い所はあまり思いつきませんが、ファイルの削除や名前変更は色々と使えそうですね。
Comments