Help using Base SAS procedures

Scan function macro

Accepted Solution Solved
Reply
Occasional Contributor
Posts: 7
Accepted Solution

Scan function macro

 

I have

 

Note : XOP PM is one word and XOP DD is one word  and X/Y/N is one word

 

%macro test;

%let xy= XOP  PM , XOP DD, X/Y/N, EPP,ACC,ENN;

want to scan how many word I have

answer  should be 6

%let n=%sysfunc(countw(%bquote(&xy)));

 

%do h=1 %to &n;

%let cname = %upcase(%scan(&xy,&h.,%str(',')));

%END;

%PUT &cname;

 

%mend;

%test;

 

So first time cname should be XOP PM and second time cname should be XOP DD and third time cname should be X/Y/N

 

Can u please help

 

 

 


Accepted Solutions
Solution
‎11-29-2017 12:25 AM
Super User
Super User
Posts: 8,120

Re: Scan function macro

[ Edited ]

Why are you specifying the delimiter for %SCAN() but not for COUNTW()?

Why are you quoting the commas in &XY for the COUNTW() function, but not for the %SCAN() function?

Why did you include single quote character in the list of delimiters?  If they are valid delimiters then you can use ',' as the delimiter specification and you will not need to use macro quoting since the actual quotes will prevent SAS from thinking the comma is part of the function call.

 

%macro test;
%local xy n h cname ;
%let xy= XOP  PM , XOP DD, X/Y/N, EPP,ACC,ENN;
%let n=%sysfunc(countw(%bquote(&xy),%str(,)));

%do h=1 %to &n;
  %let cname = %scan(%qupcase(&xy),&h,%str(,));
  %put H=&h CNAME="&cname";
%end;

%mend test;
6881   %test;
H=1 CNAME="XOP  PM"
H=2 CNAME="XOP DD"
H=3 CNAME="X/Y/N"
H=4 CNAME="EPP"
H=5 CNAME="ACC"
H=6 CNAME="ENN"

 

View solution in original post


All Replies
Solution
‎11-29-2017 12:25 AM
Super User
Super User
Posts: 8,120

Re: Scan function macro

[ Edited ]

Why are you specifying the delimiter for %SCAN() but not for COUNTW()?

Why are you quoting the commas in &XY for the COUNTW() function, but not for the %SCAN() function?

Why did you include single quote character in the list of delimiters?  If they are valid delimiters then you can use ',' as the delimiter specification and you will not need to use macro quoting since the actual quotes will prevent SAS from thinking the comma is part of the function call.

 

%macro test;
%local xy n h cname ;
%let xy= XOP  PM , XOP DD, X/Y/N, EPP,ACC,ENN;
%let n=%sysfunc(countw(%bquote(&xy),%str(,)));

%do h=1 %to &n;
  %let cname = %scan(%qupcase(&xy),&h,%str(,));
  %put H=&h CNAME="&cname";
%end;

%mend test;
6881   %test;
H=1 CNAME="XOP  PM"
H=2 CNAME="XOP DD"
H=3 CNAME="X/Y/N"
H=4 CNAME="EPP"
H=5 CNAME="ACC"
H=6 CNAME="ENN"

 

Occasional Contributor
Posts: 7

Re: Scan function macro

Hi,

 

It worked  :-)

 

 

Thank you So much

Frequent Contributor
Posts: 116

Re: Scan function macro

Use COUNTC function 

wordsn=sum(countc(sourcevar,","),1);

 

Then you can proceed with your code.

 

☑ This topic is solved.

Need further help from the community? Please ask a new question.

Discussion stats
  • 3 replies
  • 236 views
  • 0 likes
  • 3 in conversation