Read from Data File

Reads data from an open data file.

Options 

  • File ID is a numeric expression that specifies the file ID of an open data file. See Open Data File script step.
  • Amount specifies the number of bytes to read if Read as is UTF-8 or Bytes. For UTF-16, Amount is the number of Unicode code units to read. If Amount is not specified (set to nothing), the entire file is read.
  • Target is the field or variable to store the data read from the file.
  • Read as specifies the character encoding of the file.
    • UTF-16 is FileMaker's default 16-bit Unicode (UTF-16 little endian) character encoding.
    • UTF-8 is 8-bit Unicode character encoding.
    • Bytes assumes no specific character encoding, but instead reads one byte at a time. If the target is a variable or container field, data read from the file is stored as container data with the same filename as the specified file.

Compatibility 

Product Supported
FileMaker Pro Yes
FileMaker Go Yes
FileMaker WebDirect No
FileMaker Server Yes
FileMaker Cloud Yes
FileMaker Data API No
Custom Web Publishing Yes

Originated in version 

18.0

Description 

This script step reads data specified by Amount starting at the current read-write position, or it reads the entire file if Amount is not specified. See Set Data File Position.

The maximum amount of data this script step can read at a time is 64 MB. If a file is larger than 64 MB, you can perform this script step multiple times, reading an amount no larger than 64 MB each time.

Notes 

  • Performance is best when reading no more than 64 KB.
  • When reading Unicode text from a portion of a file, only part of a character may be read if the character consists of multiple code units. If you expect to read text from a UTF-8 or UTF-16 file, it may be safer to read the entire file at one time unless you are sure of the number of code points per character.

Example 1 

Reads the contents of an open file with a file ID of 2 and stores the data in a variable.

Copy
Read from Data File [ File ID: 2 ; Amount (bytes): ; Target: $variable ; Read as: Bytes ]

Example 2 

Checks whether a file named change.log exists in the Documents folder. If it does, reads the first 100 UTF-8 code units into the Utilities::Log Entry text field.

Copy
Set Variable [ $file ; Value: Get ( DocumentsPath ) & "change.log" ]
Get File Exists [ "$file" ; Target: $fileExists ]
If [ not $fileExists ]
    Exit Script [ Text Result: ]
End If
Open Data File [ "$file" ; Target: $fileID ]
Read from Data File [ File ID: $fileID ; Amount (bytes): 100 ; Target: Utilities::Log Entry ; Read as: UTF-8 ]
Close Data File [ File ID: $fileID ]

Example 3 

If the large.log file exists and is large, reads the file 64 MB at a time into a variable until the entire file is read. If the file is smaller, it reads the entire file in one read operation. Data is read into a variable for improved performance, then the data is stored in a field.

Copy
Set Error Capture [ On ]
Set Variable [ $k_FileMissingError ; Value: 100 ] 
Set Variable [ $k_EndOfFileError ; Value: 10 ]
Set Variable [ $k_64KB ; Value: 64 * 1024 ]
Set Variable [ $k_64MB ; Value: 64 * 1024 * 1024 ]
Set Variable [ $file ; Value: "large.log" ]
Get File Exists [ "$file" ; Target : $fileExists ]
If [ $fileExists = 0 ]
    Exit Script [ Result: $k_FileMissingError ]
End If

Open Data File [ "$file" ; Target: $fileID ] 

#If the file opened successfully, read the contents.
If [ Get ( LastError ) = 0 ]
    Get File Size [ "$file" ; Target: $fileSize ]

    #If the file size is greater than 64 KB, read it 64 MB at a time.
    If [ $fileSize > $k_64KB ]

        Loop [ Flush: Always ]
            #Read up to 64 MB and store it in a variable.
            Read from Data File [ File ID: $fileID ; Amount (bytes): $k_64MB ; Target: $dataChunk ; Read as: UTF-8 ]
            Set Variable [ $readError; Value:Get ( LastError ) ]

            #If the read operation was sucessful or if the end of the file was reached, concatenate the data read in this pass ($dataChunk) with the data read previously ($fileContents).
            If [ ( $readError = 0 ) or ( $readError = $k_EndOfFileError ) ]
                Set Variable [ $fileContents ; Value: $fileContents & $dataChunk ]
            End If

            #Exit the loop if the read operation failed or the end of the file is reached.
            Exit Loop If [ $readError ]
        End Loop

    Else
        #If the file is no larger than 64 KB, read it all at once.
        Read from Data File [ File ID: $fileID ; Target: $fileContents ; Read as: UTF-8 ]
    End If

    #Close the data file and store the contents in a field.
    Close Data File [ File ID: $fileID ]
    Set Field [ Table::Data ; $fileContents ]

End If