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

Hi,

can you please provise me solution of follwing problem.

 

I want to count no of words from following data with the help of do loop only (do not use COUNTW function ).

 

 data a;
input name $ 1-30;
datalines;
i am vinayak more
asif shaikh is my friend
;
run;

 

output should be like this:

 


          name                        count
i am vinayak more                4
asif shaikh is my friend         5

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
RahulG
Barite | Level 11

The below code would also take care if there are multiple blanks

 

data a;
input name $ 1-30;
datalines;
i   am vinayak more
asif shaikh   is my friend
;
run;

 

 

data new(drop = len c char_val last_char_val);
length last_char_val $1. ;
retain last_char_val;
set a;
len=length(name);
c=1;word_count=0;
do while(c<=len);
char_val=substr(name,c,1);
if char_val eq ' ' and last_char_val ne ' ' then word_count +1;
c+1;
last_char_val=char_val;
end;
word_count +1;
run;

View solution in original post

6 REPLIES 6
RahulG
Barite | Level 11

There can be many ways...below mentioned is counting of blanks by compressing blank.

 

 

data new;
set a;
word_count=length(name) - length(compress(name)) +1 ;
run;

_sas
Calcite | Level 5
Thanks rahul.
can you plz tell me how can i find this count with the help of do loop ?
RahulG
Barite | Level 11

The below code would also take care if there are multiple blanks

 

data a;
input name $ 1-30;
datalines;
i   am vinayak more
asif shaikh   is my friend
;
run;

 

 

data new(drop = len c char_val last_char_val);
length last_char_val $1. ;
retain last_char_val;
set a;
len=length(name);
c=1;word_count=0;
do while(c<=len);
char_val=substr(name,c,1);
if char_val eq ' ' and last_char_val ne ' ' then word_count +1;
c+1;
last_char_val=char_val;
end;
word_count +1;
run;

Ksharp
Super User

Why you post it at IML forum, Another DO LOOP is using CALL PRXNEXT().

 

data a;
input name $ 1-30;
datalines;
i am vinayak more
asif shaikh is my friend
;
run;
data want;
 set a;
 i=1;count=0;
 temp=scan(name,i);
 do while(not missing(temp));
  count+1;
  i+1;
  temp=scan(name,i);
 end;
drop i temp;
run;
Ksharp
Super User

OK. I just figure out IML way.

 

data a;
input name $ 1-30;
datalines;
i am vinayak more
asif shaikh is my friend
;
run;
proc iml;
use a;
read all var{name};
close;

count=j(nrow(name),1,0);
do i=1 to nrow(name);
token=substr(name[i],1:length(name[i]),1);
count[i]=sum(token=' ')+1;
end;
print name count;
quit;
RW9
Diamond | Level 26 RW9
Diamond | Level 26

And why "don't use countw"?  I would think that a function specifically designed and written for the purpose would be better than any other solution?

sas-innovate-white.png

Missed SAS Innovate in Orlando?

Catch the best of SAS Innovate 2025 — anytime, anywhere. Stream powerful keynotes, real-world demos, and game-changing insights from the world’s leading data and AI minds.

 

Register now

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 6 replies
  • 2005 views
  • 5 likes
  • 4 in conversation