データファイルから読み取る

オープンデータファイルからデータを読み取ります。

オプション 

  • [ファイル ID] は、オープンデータファイルのファイル ID を指定する数式です。[データファイルを開く] スクリプトステップを参照してください。
  • [読み取る] が [UTF-8] または [バイト] の場合は、[サイズ] には読み取るバイト数を指定します。[UTF-16] の場合は、[サイズ] は読み取る Unicode コードユニットの数です。[サイズ] が指定されていない場合 (何も設定されていない場合)、ファイル全体が読み取られます。
  • [ターゲット] は、ファイルから読み取ったデータを格納するフィールドまたは変数です。
  • [読み取る] は、ファイルの文字エンコードを指定します。
    • [UTF-16] は、FileMaker のデフォルトの 16 ビット Unicode (UTF-16 リトルエンディアン) 文字エンコードです。
    • [UTF-8] は、8 ビット Unicode 文字エンコードです。
    • [バイト] は、特定の文字エンコードを想定せず、一度に 1 バイトずつ読み取ります。ターゲットが変数またはオブジェクトフィールドの場合、ファイルから読み取られたデータは、オブジェクトデータとして保存され、指定されたファイルと同じファイル名が付けられます。

互換性 

製品 サポート
FileMaker Pro はい
FileMaker Go はい
FileMaker WebDirect いいえ
FileMaker Server はい
FileMaker Cloud はい
FileMaker Data API いいえ
カスタム Web 公開 はい

起点バージョン 

18.0

説明 

このスクリプトステップは、[サイズ] で指定された量のデータの読み取りを現在の読み取り/書き込み位置から開始するか、または [サイズ] が指定されていない場合はファイル全体を読み取ります。データファイルの位置を設定を参照してください。

このスクリプトステップが一度に読み取ることができるデータの最大サイズは 64 MB です。ファイルが 64 MB よりも大きい場合は、このスクリプトステップを複数回実行して、毎回 64 MB 未満のデータを読み取るようにできます。

メモ 

  • 読み取るデータの量が 64 KB 未満の場合にパフォーマンスが最適になります。
  • ファイルの一部から Unicode テキストを読み取る場合、複数のコードユニットで構成されている文字の一部分のみが読み取られることがあります。UTF-8 または UTF-16 ファイルからテキストを読み取るときに、文字あたりのコードポイント数がわからない場合は、ファイル全体を一度に読み取る方が安全です。

例 1 

ファイル ID が 2 のオープンデータファイルの内容を読み取り、データを変数に格納します。

コピー
データファイルから読み取る [ファイル ID: 2 ; サイズ (バイト): ; ターゲット: $variable ; 読み取る: バイト]

例 2 

「change.log」ファイルがドキュメントフォルダに存在しているかどうかを確認します。存在している場合は、最初の 100 個の UTF-8 コードユニットが [ユーティリティ::ログエントリ] テキストフィールドに読み込まれます。

コピー
変数を設定 [$file ; 値: Get (ドキュメントパス) & "change.log"]
ファイルの存在を取得 [「$file」; ターゲット: $fileExists]
If [not $fileExists]
    現在のスクリプト終了 [テキスト結果: ]
End If
データファイルを開く [「$file」; ターゲット: $fileID]
データファイルから読み取る [ファイル ID: $fileID ; サイズ (バイト): 100 ; ターゲット: ユーティリティ::ログエントリ ; 読み取る: UTF-8]
データファイルを閉じる [ファイル ID: $fileID]

例 3 

「large.log」ファイルが存在しておりサイズが大きい場合は、ファイル全体を読み取るまで、一度に 64 MB ずつ変数に読み込まれます。ファイルが小さい場合は、1 回の読み取り操作でファイル全体を読み取ります。パフォーマンス向上のためデータが変数に読み込まれ、その後フィールドに格納されます。

コピー
エラー処理 [オン]
変数を設定 [$k_FileMissingError ; 値:100 ] 
変数を設定 [$k_EndOfFileError ; 値:10 ]
変数を設定 [$k_64KB ; 値:64 * 1024]
変数を設定 [$k_64MB ; 値:64 * 1024 * 1024]
変数を設定 [$file ; 値: "large.log"]
ファイルの存在を取得 [「$file」; ターゲット : $fileExists]
If [$fileExists = 0]
    現在のスクリプト終了 [テキスト結果: $k_FileMissingError]
End If

データファイルを開く [「$file」; ターゲット: $fileID] 

# ファイルが正常に開いた場合はコンテンツを読み取ります。
If [Get (最終エラー) = 0]
    ファイルサイズを取得 [「$file」; ターゲット: $fileSize]

    # ファイルのサイズが 64 KB を超えている場合、一度に 64 MB ずつ読み取ります。
    If [$fileSize > $k_64KB]

        Loop [フラッシュ: 常に]
            # 最大 64 MB 読み取って変数に格納します。
            データファイルから読み取る [ファイル ID: $fileID ; サイズ (バイト): $k_64MB ; ターゲット: $dataChunk ; 読み取る:UTF-8]
            変数を設定 [$readError; 値:Get (最終エラー)]

            # 読み取り操作が正常に完了した場合、またはファイルの終わりに達した場合は、このパスで読み取ったデータ ($dataChunk) を以前に読み取ったデータ ($fileContents) と連結します。
            If [($readError = 0) or ($readError = $k_EndOfFileError)]
                変数を設定 [$fileContents ; 値: $fileContents & $dataChunk]
            End If

            # 読み取り操作が失敗するか、ファイルの終わりに達した場合はループを終了します。
            Exit Loop If [$readError]
        End Loop

    Else
        # ファイルサイズが 64 KB 未満の場合、ファイル全体を一度に読み取ります。
        データファイルから読み取る [ファイル ID: $fileID ; ターゲット: $fileContents ; 読み取る:UTF-8]
    End If

    # データファイルを閉じ、コンテンツをフィールドに格納します。
    データファイルを閉じる [ファイル ID: $fileID]
    フィールド設定 [テーブル::データ ; $fileContents]

End If