%macro str_split(dsn=, srcvar=, outvar=, dout=); proc sql noprint; select ceil(max(length(&srcvar))/200)-1 into :maxcnt from &dsn; quit; %put maxcnt is &maxcnt; data &dout; set &dsn; strlen=length(&srcvar); tempstr=strip(&srcvar); if strlen<=200 then do; &outvar.=strip(&srcvar); *output; end; else if strlen>200 then do; if substr(tempstr, 200, 1)='' or substr(tempstr, 201, 1)='' then do; &outvar.=substr(tempstr, 1, 200); tempstr=strip(substr(tempstr, 201)); end; else if substr(tempstr, 200, 1) ne '' or substr(tempstr, 201, 1) ne '' then do; call scan(substr(tempstr,1,200), -1, pos, length, ''); &outvar.=substr(tempstr, 1, pos-1); tempstr=strip(substr(tempstr, pos)); end; %do i=1 %to &maxcnt; %if %length(tempstr)>0 %then %do; if length(tempstr)<=200 then do; &outvar.&i=strip(tempstr); tempstr=''; end; else do; if substr(tempstr, 200, 1)='' or substr(tempstr, 201, 1)='' then do; &outvar.&i=substr(tempstr, 1, 200); tempstr=strip(substr(tempstr, 201)); end; else if substr(tempstr, 200, 1) ne '' or substr(tempstr, 201, 1) ne '' then do; call scan(substr(tempstr,1,200), -1, pos, length, ''); &outvar.&i=substr(tempstr, 1, pos-1); tempstr=strip(substr(tempstr, pos)); end; end; %end; *output; %end; end; *keep subjid aespid aedecod &srcvar strlen &outvar.: pos tempstr; run; %mend str_split; %str_split(dsn=srcdata, srcvar=srcvar, outvar=outvar, dout=outdata);