BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
dustychair
Pyrite | Level 9

Hi all,

Although there are similar questions in the community their answers didn't work for me, maybe I did something wrong. I have a string data includes numbers. I'd like to separate them to 5 digits numbers. For example,

 

Have                                                                Want 

O_ID                                            O_ID1          O_D2       O_ID3

123451122312390                      12345            11223       12390

1234690876                                12346            90876

 

I'll appreciate for  any comment, any help

1 ACCEPTED SOLUTION

Accepted Solutions
Patrick
Opal | Level 21

or this way

 

data have;
  input o_id $22.;
  cards;
123451122312390
12345678909876
123456789012345678901
1111111111
;
run;

data _null_;
  if 0 then set have(keep=o_id);
  call symputx('n_vars',ceil(vlength(o_id)/5));
  stop;
run;
%put &=n_vars;

data want(drop=_:);
  set have;
  array o_id_ {&n_vars} $5;
  do _i=1 to &n_vars;
    o_id_[_i]=substrn(o_id,(_i-1)*5+1,5);
    if missing(o_id_[_i]) then leave;
  end;
run;

 

View solution in original post

9 REPLIES 9
novinosrin
Tourmaline | Level 20
data have;
str='123451122312390';
output;
str='1234690876';
output;
run;

data want;
set have;
array want(9) $5; /*increase your array subscript to whatever value you want*/
call pokelong(str,addrlong(want1),vlength(str));
run;
34reqrwe
Quartz | Level 8

The basic idea is 

data have ; 
length oid $50.;
oid='123451122312390'    ;output;
oid='1234690876'          ;output;
run;

data want1;
	set have;
	 oid1= substr(oid,1,5);
	 oid2=substr(oid,6,5);
run;

Or in a simple macro

%macro split;
 data want2;
 set have;
	%do i = 1 %to 100 %by 5 ; 
	%put &i;
	oid&i = substr(oid, &i , 5);
	%end;
 run;
 %mend split;
 %split;

you could enhance the macro by working out the (maximum length / 5) of your initial variable and therefore how many new variables you would need to create . 

novinosrin
Tourmaline | Level 20

No need for macro

 

data have;
str='123451122312390';
output;
str='1234690876';
output;
run;

 
data want;
set have;
array want(9) $5; /*increase your array subscript to whatever value you want*/
i=0;
do p=1 by 5 while(p<length(str));
i+1;
want(i)=substr(str,p,5);
end;
drop p i;
run;
novinosrin
Tourmaline | Level 20

data have;
str='123451122312390';
output;
str='1234690876';
output;
run;

data want;
set have;
array want(9) $5; /*increase your array subscript to whatever value you want*/
j=0;
do i=1 to length(str);
k=mod(i,5);
if k=1 then do;
j+1;
want(j)=substr(str,i,5);
end;
end;
drop i j k;
run;
Satish_Parida
Lapis Lazuli | Level 10

This code gives the expected result, I have used some test data.

 

data have;
input o_id;
format o_id best32.;
cards;
123451122312390
12345678909876
123456789012345678901
1111111111
;
run;

proc sql noprint;
select max(length(strip(put(o_id,32. -L)))) into :max_len from have;
quit;

%let var_length=5;
%let no_of_cols=%eval(&max_len. / &var_length. + 1);

data want(drop=i init);
set have;
array o_id_[&no_of_cols.];
init=1;
do i=1 to &no_of_cols.;
	if i ne 1 then init=(i-1)*&var_length.;
	o_id_[i]=substr(strip(put(o_id,32. -L)),init,&var_length.);
end;
run;

Please let us know if it worked for you.

Ksharp
Super User
data have;
input o_id $22.;
cards;
123451122312390
12345678909876
123456789012345678901
1111111111
;
run;
data temp(index=(o_id));
 set have;
 length _id $ 200;
 _id=o_id;
 do i=1 to length(_id) by 5;
  temp=substr(_id,i,5);
  if not missing(temp) then output;
 end;
drop _id i;
run;
proc transpose data=temp out=want;
by o_id;
var temp;
run;
Patrick
Opal | Level 21

or this way

 

data have;
  input o_id $22.;
  cards;
123451122312390
12345678909876
123456789012345678901
1111111111
;
run;

data _null_;
  if 0 then set have(keep=o_id);
  call symputx('n_vars',ceil(vlength(o_id)/5));
  stop;
run;
%put &=n_vars;

data want(drop=_:);
  set have;
  array o_id_ {&n_vars} $5;
  do _i=1 to &n_vars;
    o_id_[_i]=substrn(o_id,(_i-1)*5+1,5);
    if missing(o_id_[_i]) then leave;
  end;
run;

 

mansour_ib_sas
Pyrite | Level 9

I propose this solution:

data test;
input O_IDO best32.;
format O_IDO best32.;
cards;
123451122312390
1234690876
123469087
; run;

data test1(drop=i);
set test;
i=1;
do while(i<=length(compress(put(O_IDO,best32.))));
O_ID=substr(compress(put(O_IDO,best32.)),i,5);
i+5;
output;
end;
run;

proc sort data=test1 ; by O_IDO; run;

proc transpose data=test1 out=test2(drop=_name_) prefix=O_OD;by O_IDO ; var O_ID; run; 
dustychair
Pyrite | Level 9

Hi @Patrick ,

Thank your for your response. Your code worked.

 

Sincerely,

SAS Innovate 2025: Save the Date

 SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!

Save the date!

How to Concatenate Values

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.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 9 replies
  • 1447 views
  • 5 likes
  • 7 in conversation