If you have been using this tip for generating resolved code in your RMFI programs, you have probably noticed a lot of extra code that – whilst necessary to generate initial results – is not required to recreate those results. This is due to the fact that a lot of code is used to dynamically generate further code.
In any case, here is a program I use to make the resolved code more manageable:
%let loc=C:tempMyResolvedCode.txt;
proc sql;
create table x as select * from dictionary.macros
where scope=‘GLOBAL’ and substr(name,1,4)=‘LIB_’;
where scope=‘GLOBAL’ and substr(name,1,4)=‘LIB_’;
data _null_; set x; call execute(‘%symdel ‘||name||‘;’); run;
%put executed on %sysfunc(datetime(),datetime19.);
data _null_;
infile “&loc” lrecl=32767 missover;
file “&loc.2” lrecl=32767;
input;
retain ret_colon 0;
if substr(_infile_,length(_infile_),1)=“;” then colon=1;
else colon=0;
if _infile_=“;” and ret_colon=1 then goto exit;
else if subpad(_infile_,1,11)=“filename _T” then goto exit;
else if upcase(_infile_)=:‘DATA _NULL_’ then
do until(_infile_=‘run;’);/* code will exit below anyway*/
input;
if upcase(_infile_)=‘RUN;’ or upcase(_infile_)=‘RUN ;’
then goto exit;
then goto exit;
end;
else if ret_colon and colon then do;
if upcase(_infile_)=‘QUIT;’ or upcase(_infile_)=‘QUIT ;’
then goto exit;
then goto exit;
else if _infile_=:‘call symput’ then goto exit;
else if _infile_=:“label “ and count(_infile_,‘”‘)=2
and count(_infile_,‘=’)=1 then goto exit;
else if _infile_=:‘put “*ERROR*: Object with’ then goto exit;
else if upcase(_infile_)=: ‘LIBNAME’ then do;
/* remove consecutive libnames pointing to same place */
if find(upcase(_infile_),‘ CLEAR;’) then goto exit;
else if find(upcase(_infile_),‘ TMP ‘) then goto exit;
else if find(upcase(_infile_),‘ TMP ‘) then goto exit;
libnm=cats(‘LIB_’,scan(_infile_,2));
if symexist(libnm) then libcomp=symget(libnm);
libref=scan(_infile_,2,‘”‘);
if libref=libcomp then goto exit;
else call symput(libnm,libref);
end;
else if upcase(_infile_)=:‘SELECT ‘
and ( find(upcase(_infile_),‘ INTO :’)
orfind(upcase(_infile_),‘ INTO:’) )
then goto exit;
else if upcase(_infile_)=:‘OPTIONS’ then goto exit;
else if upcase(_infile_)=:‘FILENAME ‘ then goto exit;
end;
put _infile_;
infile=_infile_;
output;
exit:
ret_colon=colon;
run;