I agree with Reeza, and suggest the "input record buffer" be parsed using one of a few different DATA step functions, likely considering maybe SCAN, FIND, SUBSTR, INDEX, INDEXC, and possibly VVALUE or VVALUEX for assignment.
Suggested DATA step structure approach demonstrated below:
DATA ;
KEEP ....;
* RECOMMEND CODING SAS ATTRIB OR LENGTH STATEMENTS ;
* HERE TO DECLARE EXPECTED SAS VARIABLES. ;
INFILE ....;
INPUT ;
DO WHILE(1=1);
* COME HERE FOR INFINITE LOOP TO PARSE CURRENT INPUT ;
* RECORD AND DECODE ONE OR MORE SUB-FIELDS. ;
LENGTH TEMPVAR $1000;
I+1;
TEMPVAR = SCAN(_INFILE_,I,'!');
* EXIT THE DO LOOP NOW WHEN NO MORE FIELDS TO PARSE. ;
IF TEMPVAR = ' ' THEN LEAVE;
* YOUR PARSING CODE FOR EACH RECORD SUBTYPE/FIELDS GOES HERE.;
END;
RUN;
... View more