ABAP File Operations: OPEN DATASET, READ, TRANSFER

Category
ABAP-Statements
Published
Author
Johannes

File operations enable reading and writing files on the SAP application server. The commands OPEN DATASET, READ DATASET, TRANSFER and CLOSE DATASET form the foundation for file processing in ABAP.

Basic Commands

CommandDescription
OPEN DATASETOpen file
READ DATASETRead data from file
TRANSFERWrite data to file
CLOSE DATASETClose file
DELETE DATASETDelete file

Syntax

Open File

OPEN DATASET <filename>
FOR { INPUT | OUTPUT | APPENDING | UPDATE }
IN { TEXT MODE | BINARY MODE | LEGACY TEXT MODE }
[ ENCODING { DEFAULT | UTF-8 | NON-UNICODE } ]
[ WITH { SMART | NATIVE | UNIX | WINDOWS } LINEFEED ]
[ MESSAGE <message> ].

Read/Write File

READ DATASET <filename> INTO <data> [ LENGTH <length> ].
TRANSFER <data> TO <filename> [ LENGTH <length> ].

Close/Delete File

CLOSE DATASET <filename>.
DELETE DATASET <filename>.

Examples

1. Write Text File

DATA: lv_file TYPE string VALUE '/tmp/output.txt',
lv_message TYPE string.
" Open file for writing
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
ENCODING UTF-8
MESSAGE lv_message.
IF sy-subrc = 0.
" Write lines
TRANSFER 'Line 1: Hello World' TO lv_file.
TRANSFER 'Line 2: ABAP is great' TO lv_file.
TRANSFER 'Line 3: End of file' TO lv_file.
CLOSE DATASET lv_file.
WRITE: / 'File written successfully'.
ELSE.
WRITE: / 'Error:', lv_message.
ENDIF.

2. Read Text File

DATA: lv_file TYPE string VALUE '/tmp/input.txt',
lv_line TYPE string.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
ENCODING UTF-8.
IF sy-subrc = 0.
" Read line by line
DO.
READ DATASET lv_file INTO lv_line.
IF sy-subrc <> 0.
EXIT. " End of file
ENDIF.
WRITE: / lv_line.
ENDDO.
CLOSE DATASET lv_file.
ELSE.
WRITE: / 'File could not be opened'.
ENDIF.

3. Read File into Table

DATA: lv_file TYPE string VALUE '/tmp/data.txt',
lv_line TYPE string,
lt_lines TYPE TABLE OF string.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
DO.
READ DATASET lv_file INTO lv_line.
IF sy-subrc <> 0.
EXIT.
ENDIF.
APPEND lv_line TO lt_lines.
ENDDO.
CLOSE DATASET lv_file.
" Processing
WRITE: / 'Lines read:', lines( lt_lines ).
ENDIF.

4. Write Table to File

DATA: lv_file TYPE string VALUE '/tmp/export.txt',
lt_lines TYPE TABLE OF string.
lt_lines = VALUE #(
( `Name;Age;City` )
( `Max;30;Berlin` )
( `Anna;25;Munich` )
( `Peter;35;Hamburg` )
).
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
LOOP AT lt_lines INTO DATA(lv_line).
TRANSFER lv_line TO lv_file.
ENDLOOP.
CLOSE DATASET lv_file.
WRITE: / 'Exported:', lines( lt_lines ), 'lines'.
ENDIF.

5. Process CSV File

TYPES: BEGIN OF ty_customer,
name TYPE string,
age TYPE i,
city TYPE string,
END OF ty_customer.
DATA: lv_file TYPE string VALUE '/tmp/customers.csv',
lv_line TYPE string,
lt_customers TYPE TABLE OF ty_customer,
lt_fields TYPE TABLE OF string.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Skip header line
READ DATASET lv_file INTO lv_line.
" Read data lines
DO.
READ DATASET lv_file INTO lv_line.
IF sy-subrc <> 0.
EXIT.
ENDIF.
" Split line
SPLIT lv_line AT ';' INTO TABLE lt_fields.
IF lines( lt_fields ) >= 3.
APPEND VALUE ty_customer(
name = lt_fields[ 1 ]
age = CONV #( lt_fields[ 2 ] )
city = lt_fields[ 3 ]
) TO lt_customers.
ENDIF.
ENDDO.
CLOSE DATASET lv_file.
ENDIF.
" Display result
LOOP AT lt_customers INTO DATA(ls_cust).
WRITE: / ls_cust-name, ls_cust-age, ls_cust-city.
ENDLOOP.

6. Create CSV Export

DATA: lv_file TYPE string VALUE '/tmp/export.csv',
lv_line TYPE string.
DATA: lt_orders TYPE TABLE OF ty_order.
" Test data
lt_orders = VALUE #(
( id = 1 customer = 'Miller' amount = '100.50' )
( id = 2 customer = 'Schmidt' amount = '250.00' )
( id = 3 customer = 'Weber' amount = '75.25' )
).
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
" Write header
TRANSFER 'ID;Customer;Amount' TO lv_file.
" Data lines
LOOP AT lt_orders INTO DATA(ls_order).
lv_line = |{ ls_order-id };{ ls_order-customer };{ ls_order-amount }|.
TRANSFER lv_line TO lv_file.
ENDLOOP.
CLOSE DATASET lv_file.
ENDIF.

7. Read Binary File

DATA: lv_file TYPE string VALUE '/tmp/image.png',
lv_data TYPE xstring,
lv_buffer TYPE x LENGTH 1024,
lv_length TYPE i.
OPEN DATASET lv_file FOR INPUT IN BINARY MODE.
IF sy-subrc = 0.
DO.
READ DATASET lv_file INTO lv_buffer LENGTH lv_length.
IF sy-subrc <> 0.
EXIT.
ENDIF.
" Append data
CONCATENATE lv_data lv_buffer(lv_length) INTO lv_data IN BYTE MODE.
ENDDO.
CLOSE DATASET lv_file.
WRITE: / 'Read:', xstrlen( lv_data ), 'bytes'.
ENDIF.

8. Write Binary File

DATA: lv_file TYPE string VALUE '/tmp/output.bin',
lv_data TYPE xstring.
" Binary data (e.g., from DB or processing)
lv_data = 'A1B2C3D4E5F6'.
OPEN DATASET lv_file FOR OUTPUT IN BINARY MODE.
IF sy-subrc = 0.
TRANSFER lv_data TO lv_file.
CLOSE DATASET lv_file.
ENDIF.

9. Append to File (APPENDING)

DATA: lv_file TYPE string VALUE '/tmp/log.txt',
lv_line TYPE string.
" Add date/time to log
lv_line = |{ sy-datum DATE = ISO } { sy-uzeit TIME = ISO }: New entry|.
OPEN DATASET lv_file FOR APPENDING IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
TRANSFER lv_line TO lv_file.
CLOSE DATASET lv_file.
ENDIF.

10. Check and Delete File

DATA: lv_file TYPE string VALUE '/tmp/temp.txt'.
" Check if file exists (by opening)
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING DEFAULT.
IF sy-subrc = 0.
CLOSE DATASET lv_file.
WRITE: / 'File exists'.
" Delete file
DELETE DATASET lv_file.
IF sy-subrc = 0.
WRITE: / 'File deleted'.
ENDIF.
ELSE.
WRITE: / 'File does not exist'.
ENDIF.

11. Read Directory

DATA: lv_dir TYPE string VALUE '/tmp/',
lt_files TYPE TABLE OF string,
lv_filename TYPE string.
" Open directory
CALL FUNCTION 'EPS_GET_DIRECTORY_LISTING'
EXPORTING
dir_name = CONV eps2path( lv_dir )
TABLES
dir_list = lt_files
EXCEPTIONS
invalid_eps_subdir = 1
sapgparam_failed = 2
build_directory_failed = 3
no_authorization = 4
read_directory_failed = 5
too_many_read_errors = 6
empty_directory_list = 7
OTHERS = 8.
IF sy-subrc = 0.
LOOP AT lt_files INTO lv_filename.
WRITE: / lv_filename.
ENDLOOP.
ENDIF.

12. File with Error Message

DATA: lv_file TYPE string VALUE '/nonexistent/path/file.txt',
lv_message TYPE string.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
ENCODING UTF-8
MESSAGE lv_message.
IF sy-subrc <> 0.
WRITE: / 'Error opening:'.
WRITE: / lv_message.
WRITE: / 'Return Code:', sy-subrc.
ENDIF.

13. Line Break Modes

" Unix line break (LF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
ENCODING UTF-8
WITH UNIX LINEFEED.
" Windows line break (CRLF)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
ENCODING UTF-8
WITH WINDOWS LINEFEED.
" Automatic (depending on server)
OPEN DATASET lv_file FOR OUTPUT IN TEXT MODE
ENCODING UTF-8
WITH NATIVE LINEFEED.
" Smart: Write like Native, Read detects automatically
OPEN DATASET lv_file FOR INPUT IN TEXT MODE
ENCODING UTF-8
WITH SMART LINEFEED.

14. Positioning in File

DATA: lv_file TYPE string VALUE '/tmp/data.bin',
lv_data TYPE x LENGTH 100,
lv_pos TYPE i.
OPEN DATASET lv_file FOR UPDATE IN BINARY MODE.
IF sy-subrc = 0.
" Get position
GET DATASET lv_file POSITION lv_pos.
WRITE: / 'Current position:', lv_pos.
" Jump to position
SET DATASET lv_file POSITION 100.
" Read from position 100
READ DATASET lv_file INTO lv_data.
CLOSE DATASET lv_file.
ENDIF.

15. Process Large Files Efficiently

CONSTANTS: c_buffer_size TYPE i VALUE 8192.
DATA: lv_file TYPE string VALUE '/tmp/large_file.txt',
lv_buffer TYPE string,
lv_count TYPE i.
OPEN DATASET lv_file FOR INPUT IN TEXT MODE ENCODING UTF-8.
IF sy-subrc = 0.
DO.
READ DATASET lv_file INTO lv_buffer.
IF sy-subrc <> 0.
EXIT.
ENDIF.
lv_count = lv_count + 1.
" Process without storing all lines
" process_line( lv_buffer ).
" Show progress (every 10000 lines)
IF lv_count MOD 10000 = 0.
WRITE: / 'Processed:', lv_count, 'lines'.
ENDIF.
ENDDO.
CLOSE DATASET lv_file.
WRITE: / 'Total:', lv_count, 'lines'.
ENDIF.

16. Create Temporary File

DATA: lv_temp_file TYPE string,
lv_guid TYPE sysuuid_c32.
" Generate unique filename
lv_guid = cl_system_uuid=>create_uuid_c32_static( ).
lv_temp_file = |/tmp/temp_{ lv_guid }.txt|.
" Use temporary file
OPEN DATASET lv_temp_file FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
TRANSFER 'Temporary data' TO lv_temp_file.
CLOSE DATASET lv_temp_file.
" ... processing ...
" Clean up
DELETE DATASET lv_temp_file.

Encoding Options

EncodingDescription
DEFAULTSystem default
UTF-8Unicode (recommended)
NON-UNICODELegacy, non-Unicode

sy-subrc Values

ValueMeaning
0Successful
4End of file (READ)
8Error (file not found, no authorization)

ABAP Cloud Alternative

" In ABAP Cloud: FILE interface not available
" Instead: CL_ABAP_FILE_UTILITIES or XCO
" Example with XCO (Cloud)
DATA(lo_file) = xco_cp=>file( '/tmp/test.txt' ).
" Check if exists
IF lo_file->exists( ).
" Read
DATA(lv_content) = lo_file->read( )->as_string( ).
ENDIF.

Important Notes / Best Practice

  • Always call CLOSE DATASET – even on errors (TRY-FINALLY).
  • Use UTF-8 as encoding for modern files.
  • Use MESSAGE addition for meaningful error messages.
  • sy-subrc = 4 on READ means end of file (EOF).
  • APPENDING to append to existing files.
  • Process large files line by line instead of loading completely.
  • Check authorizations (S_DATASET) for file access.
  • Always specify absolute paths (not relative).
  • In ABAP Cloud, file operations are restricted – use XCO.
  • Binary files for non-text content (images, PDFs).