57%macro mp_replace(infile,
63%local inref dttm ds1 replen;
64%let inref=%mf_getuniquefileref();
65%let outref=%mf_getuniquefileref();
66%
if &outfile=0 %then %let outfile=&infile;
67%let ds1=%mf_getuniquename(prefix=allchars);
68%let ds2=%mf_getuniquename(prefix=startmark);
71%let replen=%length(%superq(&replacevar));
74%let dttm=%sysfunc(datetime());
76filename &inref &infile lrecl=1 recfm=n;
80 input sourcechar $char1. @@;
81 format sourcechar hex2.;
86 length
string $ %length(%superq(&findvar));
87 string =symget(
"&findvar");
90 firstchar=char(
string,1);
91 findlen=lengthm(
string);
94 set &ds1 nobs=nobs point=_N_;
95 if sourcechar=firstchar then
do;
98 do point=_N_ to min(_N_ + findlen -1,nobs);
100 if sourcechar=char(
string, pos) then s + 1;
105 if s=findlen then
do;
118 declare hash HS(dataset:
"&ds2(keep=start)");
119 HS.defineKey(
"start");
121 declare hash HE(dataset:
"&ds2(keep=stop)");
122 HE.defineKey(
"stop");
125 set &ds1 end=eof curobs =n;
126 start = ^HS.check(key:n);
127 stop = ^HE.check(key:n);
129 strt =put(start,best. -L);
136 keep sourcechar strt;
139filename &outref &outfile recfm=n;
142 %
if &replen>0 %then %
do;
143 length replace $ &replen;
144 replace=symget(
"&replacevar");
149 if strt =
"1" then
do;
150 %
if &replen>0 %then %
do;
154 else put sourcechar char1.;