TYPES: BEGIN OF ty_dbf_record,
field1 TYPE char10, " Char
field2 TYPE n LENGTH 5, " Numc (Always numeric char internally)
field3 TYPE d, " Date (DBF saves dates as 'YYYYMMDD')
field4 TYPE p DECIMALS 2, " Dec (Maps to plain decimal string)
" Define all remaining 60 fields here in identical data sequence
END OF ty_dbf_record.
DATA: lt_target_table TYPE STANDARD TABLE OF ty_dbf_record,
ls_target_row TYPE ty_dbf_record.
DATA: lv_filepath TYPE string VALUE '/usr/sap/trans/yourfile.dbf',
lv_header_bin TYPE x LENGTH 32,
lv_header_len TYPE i,
lv_record_len TYPE i,
lv_raw_record TYPE string. " Record container
" 1. Open the file strictly in binary mode to accurately handle byte structures
OPEN DATASET lv_filepath FOR INPUT IN BINARY MODE.
IF sy-subrc <> 0.
MESSAGE 'Failed to open application server file.' TYPE 'E'.
ENDIF.
" 2. Read the first 32 bytes to dynamically capture file boundaries
READ DATASET lv_filepath INTO lv_header_bin.
" Extract Header Length from Bytes 8-9 (Convert Little-Endian Hex to ABAP Integer)
lv_header_len = lv_header_bin+8(1) + ( lv_header_bin+9(1) * 256 ).
" Extract Record Length from Bytes 10-11
lv_record_len = lv_header_bin+10(1) + ( lv_header_bin+11(1) * 256 ).
" 3. Skip past the rest of the metadata header directly to record start
SET DATASET lv_filepath POSITION lv_header_len.
" 4. Loop to process 70,000 lines line-by-line (Zero impact on heap memory)
DO.
" Read one precise record package at a time using its length property
READ DATASET lv_filepath INTO lv_raw_record MAXIMUM LENGTH lv_record_len.
IF sy-subrc <> 0.
EXIT. " End of file reached smoothly
ENDIF.
" Skip records flagged as deleted (First byte is '*')
IF lv_raw_record+0(1) = '*'.
CONTINUE.
ENDIF.
" 5. Populate your fields using offset mapping (+Position(Length))
" NOTE: Remember offset 0 is the deletion flag, so field 1 starts at 1
ls_target_row-field1 = lv_raw_record+1(10). " Mapping a 10-char text field
ls_target_row-field2 = lv_raw_record+11(5). " Mapping a 5-digit NUMC
ls_target_row-field3 = lv_raw_record+16(8). " DBF Dates 'YYYYMMDD' map perfectly to DATS
ls_target_row-field4 = lv_raw_record+24(12). " ABAP natively casts raw decimals '1540.50' to P/DEC fields
" ... map remaining 56 fields based on your DBF field specifications ...
APPEND ls_target_row TO lt_target_table.
CLEAR ls_target_row.
ENDDO.
CLOSE DATASET lv_filepath.
No comments:
Post a Comment