conniffac
conniffac

Reputation: 51

SAS - replacing a character with a space?

Had a quick question - I need to remove punctuation and replace characters with a space (i.e.: if I have a field that contains a * I need to replace it with a white space).

I can't seem to get it right - I was originally doing this to just remove it, but I've found that in some cases my string is being squished together.

Thoughts?

STRING2 = compress(STRING, ":,*~’°-!';()®""@#$%^&©+=\/|[]}{]{?><ÉÑËÁ’ÍÓÄö‘—È…...");     

Upvotes: 1

Views: 5889

Answers (5)

Tom
Tom

Reputation: 51566

The COMPRESS() function will remove the characters. If you want to replace them with spaces then use the TRANSLATE() function. If you want to reduce multiple blanks to a single blank use the COMPBL() function.

STRING2 = compbl(translate(STRING,' ',":,*~’°-!';()®""@#$%^&©+=\/|[]}{]{?><ÉÑËÁ’ÍÓÄö‘—È…...")); 

Rather than listing the characters that need to be converted to spaces you could use COMPRESS() to turn the problem around to listing the characters that should be kept.

So this example will use the modifiers ad on the COMPRESS() function call to pass the characters in STRING that are not alphanumeric characters to the TRANSLATE() function call so they will be replaced by spaces.

STRING2 = compbl(translate(STRING,' ',compress(STRING,' ','ad'))); 

Upvotes: 3

Parul
Parul

Reputation: 21

Try it with the help of regular expressions.
data have;
old = "AM;'IGH}|GH";
new = prxchange("s/[^A-Z]/ /",-1,old);
run;
proc print data=have nobs;
run;

OUTPUT-
old new

 AM;'IGH}|GH    AM  IGH  GH

Upvotes: 0

Vasilij Nevlev
Vasilij Nevlev

Reputation: 1449

While translate function could get you there, you could also use REGEX in SAS. It is more elegant, but you need to escape the characters in the actual regex pattern.

data want; 
   input string $60.; 
   length new_string $60.; 
   new_string = prxchange('s/([\:\,\*\~\’\°\-\!\'||"\'"||';\(\)\®\"\"\@\#\$\%\^\&\©\+\=\\\/\|\[\}\{\]\{\\\?\>\<\É\Ñ\Ë\Á\’\Í\Ó\Ä\ö\‘\—\È\…\.\.\.\]])/ /',-1,string); 
   datalines; 
Cats, dogs, and anyone else!
;

Upvotes: 0

DomPazz
DomPazz

Reputation: 12465

Try the TRANSLATE() function.

TRANSLATE(SOURCE,TO,FROM);

data test;
string = "1:,*2~’°-ÍÓ3Äö‘—È…...4";
string2 = translate(string,
   "                                                    ",
   ":,*~’°-!';()®""@#$%^&©+=\/|[]}{]{?><ÉÑËÁ’ÍÓÄö‘—È…...");
put string2=;
run;

I get

string2=1   2      3         4

Upvotes: 0

RamB
RamB

Reputation: 428

Try using the translate function and see if it fits your needs:

data want;
STRING = "!';AAAAÄAA$";
STRING2 = translate(STRING,' ',':;,*~''’°-!()®@""#$%^&©+=\/|[]}{]{?><ÉÑËÁ’ÍÓÄö‘—È…...');
run;

Output:

STRING         STRING2

!';AAAAÄAA$ AAAA AA

Upvotes: 0

Related Questions