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-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

Register now!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

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