Hi. If any name is possible at any place inside comments, I would suggest gathering all available names in a first pass and then with a second pass doing all the substitutions based on this list. If you want, you can also add to the list any additional names. %let NAMES=MR. MRS. MS. MISS DR.; * add aditional names here, if needed; * first pass, gather every firstname and lastname into a list; data _null_; set have; if not index(cat(' ',symget('NAMES'),' '),FIRSTNAME) then call symput('NAMES',catx(' ',symget('NAMES'),upcase(FIRSTNAME))); if not index(cat(' ',symget('NAMES'),' '),LASTNAME) then call symput('NAMES',catx(' ',symget('NAMES'),upcase(LASTNAME))); run; %put NAMES=&NAMES; * list names to mask; * second pass, mask names; data want; length _WORD $200 _SEP $1; set have; drop _:; * drop aux vars; _COMMENTS=COMMENTS; _COMMENTS=''; _SEP=''; * init aux vars; * process one word; do _I=1 to countw(COMMENTS); _COMMENTS=catx(_SEP,_COMMENTS,_WORD); _WORD=scan(COMMENTS,_I,' '); * if match, mask word; if index(" &NAMES ",cat(' ',strip(upcase(_WORD)),' ')) then do; _WORD=repeat('X',lengthn(_WORD)-1); _SEP='X'; end; else _SEP=' '; * clear masking separator; end; COMMENTS=catx(_SEP,_COMMENTS,_WORD); run; Hope it helps. Daniel Santos @ www.cgd.pt
... View more