Calcite | Level 5

## Extracting numbers from a string variable with varying lengths

Hello everybody,

I have a string variable with varying lengths and values go like this -

Var1

1

-1-3

456

-6-7-8

What I am trying to achieve right here is to extract the number along with their signs and create a new variable for each integer.

Here is the layout I am hoping to look at:

var1   var2    var 3

1

-1        -3

4          5          6

-6        -7        -8

Any help with this would be greatly appreciated.

Thank you

1 ACCEPTED SOLUTION

Accepted Solutions
PROC Star

## Re: Extracting numbers from a string variable with varying lengths

There are probably more elegant ways to do this but this seems to work:

``````data have;
input string \$;
cards;
1
-1-3
456
-6-7-8
;
run;

data want;
keep string var1 - var3;
set have;
array vars var1 - var3;
start = 1;
do i = 1 to 3;
pos = anydigit(string, start);
if pos then do;
if pos = start then vars(i) = input(substr(string, start,1), 1.);
else vars(i) = input(substr(string, start, 2), 2.);
start = pos + 1;
end;
end;
run;``````
5 REPLIES 5
Pyrite | Level 9

## Re: Extracting numbers from a string variable with varying lengths

are they all single digits?
Calcite | Level 5

## Re: Extracting numbers from a string variable with varying lengths

Yes, they are all single digits
PROC Star

## Re: Extracting numbers from a string variable with varying lengths

There are probably more elegant ways to do this but this seems to work:

``````data have;
input string \$;
cards;
1
-1-3
456
-6-7-8
;
run;

data want;
keep string var1 - var3;
set have;
array vars var1 - var3;
start = 1;
do i = 1 to 3;
pos = anydigit(string, start);
if pos then do;
if pos = start then vars(i) = input(substr(string, start,1), 1.);
else vars(i) = input(substr(string, start, 2), 2.);
start = pos + 1;
end;
end;
run;``````
Calcite | Level 5

## Re: Extracting numbers from a string variable with varying lengths

Wonderful! The code worked like a miracle. Thank you very much!

Super User

## Re: Extracting numbers from a string variable with varying lengths

``````data have;
input string \$;
cards;
1
-1-3
456
-6-7-8
;
run;
data temp;
set have;
id+1;
temp=prxchange('s/(-?\d)/ \1 /',-1,string);
do i=1 to countw(temp,' ');
value=scan(temp,i,' ');output;
end;
keep id value;
run;
proc transpose data=temp out=want;
by id;
var value;
run;``````
Discussion stats
• 5 replies
• 676 views
• 2 likes
• 4 in conversation