I am trying to calculate the number of numeric values in a macro parameter.
The code below works for character strings-
%let x = A B C;
%let n = %SYSFUNC(COUNTW(&x));
The code below does not work for numeric values-
%let x = 10 20 50;
%let n = %SYSFUNC(COUNT(&x));
I know COUNT does not work like this. Which function i can use to solve it?
For your example, you can still use COUNTW.
Do you have more complex situations, such as:
%let x = 20 abc 50 A1;
If so, what would you like the result to be?
%let x = 20 abc 50 A1;
It should return 2 since two values are numeric.
Counting numeric vs. character separately is much harder.
But COUNTW will work with a list of numeric values. There must be some other problem. You can always post the code that gives you a blank.
How about this :
%macro count_digit(t=);
%local temp count;
%let count=0;
%do i=1 %to %sysfunc(countw(&t));
%let temp=%scan(&t,&i);
%if %datatyp(&temp)=NUMERIC %then %do;
%let count=%eval(&count+1);
%end;
%end;
&count
%mend;
%let x = 20 abc 50 A1;
%let n = %count_digit(t=&x);
%put &n;
Great suggestion from @Ksharp (as always). The %DATATYP autocall macro would even recognize leading plus or minus signs, decimal points or scientific notation (...E-6) as valid parts of numeric values. If this more general type of numeric "words" could occur, however, the sets of delimiters used by both COUNTW and %SCAN should be restricted (e.g. reduced to blanks, as shown below), as otherwise plus and minus signs and decimal points would be regarded as delimiters:
countw(&t,%str( ))
%scan(&t,&i,%str( ))
Probably misunderstanding how COUNT works. Count counts the number of times a substring appears in a string.
Count("xyxzxb 123","x") would return 3 times that X appears in the string.
%let x= 1,2,3;
%let count=%sysfunc(n(x)); would give you count but the list would have to be comma separated which in general is a suboptimal choice with macro variables and fails miserably if any nonnumeric noncomma characters are encountered.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and save with the early bird rate—just $795!
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.
Ready to level-up your skills? Choose your own adventure.