I have a dataset with a char variable containing the following example values:
AA1
AA2a
AA10
AA11a
BB3
BB3b
BB10
BB11b
Essentially I want to zero-pad the numeric part of each value (e.g. 'AA2a' becomes 'AA02a') and thought the prxchange function would be a quick and simple way of achieving this. However, the problem I have run into is how to reference the zero in the replacement text.
So far the code is similar to:
var2 = prxchange('s/^(\w{2})(\d{1})(\D?)$/$1$2$3/', -1, trim(var1));
How do I reference (and delimit) the zero character in the replacement string of the prxchange function ($1 ->0<- $2$3)?
Never mind, I've managed to find the solution whilst scrawling the interweb!
For those that are interested... use the perl metacharacter \Q which escapes all non-word characters.
So, the code becomes:
var2 = prxchange('s/^(\w{2})(\d{1})(\D?)$/$1\Q0$2$3/', -1, trim(var1));
Never mind, I've managed to find the solution whilst scrawling the interweb!
For those that are interested... use the perl metacharacter \Q which escapes all non-word characters.
So, the code becomes:
var2 = prxchange('s/^(\w{2})(\d{1})(\D?)$/$1\Q0$2$3/', -1, trim(var1));
data have;
input x $;
y=prxchange('s/^([a-z]+)(\d)([a-z]*)$/\10\2\3/i',1,strip(x));
cards;
AA1
AA2a
AA10
AA11a
BB3
BB3b
BB10
BB11b
;
run;
Thanks for the reply Ksharp but your proposal wouldn't work as the prxchange function would look for the input buffer "\10".
But there are only three buffer. Did you run my code and see the output? or try $10
Don't miss out on SAS Innovate - Register now for the FREE Livestream!
Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.