Coding a Macro to tell whether one string is in a string list or not[Code and Log are below].
In one way, it works. But in the other way, it is a BIG NOT. When the String to pass as var with additional space after, the return
value changes from 1 to 0?!!
Anyone helps...
%let vrf_sellist=vrf_ordval_dif_acs_p vrf_ordval_dif_mix_1 vrf_ordval_dif_mix_2 vrf_ordval_dif_p vrf_ordvol_dif_p vrf_ordvol_dif_p_d vrf_val_dif_p;
%macro isin(vlist, var); %local i isin; %let n_vars=%sysfunc(countw(&vlist.)); %let isin=0; %do i=1 %to &n_vars; %if &var.=%scan(&vlist.,&i) %then %do; %let isin=1; %end; %end;
&isin %mend;
%isin(&vrf_sellist., vrf_ordval_dif_acs_p); /*=1*/ %isin(&vrf_sellist., vrf_ordnet_dif_acs_p ); /*=0*/
7532 %let vrf_sellist=vrf_ordval_dif_acs_p vrf_ordval_dif_mix_1 vrf_ordval_dif_mix_2 7532! vrf_ordval_dif_p vrf_ordvol_dif_p vrf_ordvol_dif_p_d vrf_val_dif_p; 7533 7534 %macro isin(vlist, var); 7535 %local i isin; 7536 %let n_vars=%sysfunc(countw(&vlist.)); 7537 %let isin=0; 7538 %do i=1 %to &n_vars; 7539 %if &var.=%scan(&vlist.,&i) %then %do; 7540 %let isin=1; 7541 %end; 7542 %end; 7543 7544 &isin 7545 %mend; 7546 7547 7548 7549 %isin(&vrf_sellist., vrf_ordval_dif_acs_p); /*=1*/ MLOGIC(ISIN): Beginning execution. MLOGIC(ISIN): Parameter VLIST has value vrf_ordval_dif_acs_p vrf_ordval_dif_mix_1 vrf_ordval_dif_mix_2 vrf_ordval_dif_p vrf_ordvol_dif_p vrf_ordvol_dif_p_d vrf_val_dif_p MLOGIC(ISIN): Parameter VAR has value vrf_ordval_dif_acs_p MLOGIC(ISIN): %LOCAL I ISIN MLOGIC(ISIN): %LET (variable name is N_VARS) MLOGIC(ISIN): %LET (variable name is ISIN) MLOGIC(ISIN): %DO loop beginning; index variable I; start value is 1; stop value is 7; by value is 1. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is TRUE MLOGIC(ISIN): %LET (variable name is ISIN) MLOGIC(ISIN): %DO loop index variable I is now 2; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 3; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 4; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 5; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 6; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 7; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 8; loop will not iterate again. NOTE: Line generated by the macro variable "ISIN". 1 1 - 180 MPRINT(ISIN): 1 MLOGIC(ISIN): Ending execution.
ERROR 180-322: Statement is not valid or it is used out of proper order.
7550 %isin(&vrf_sellist., vrf_ordnet_dif_acs_p ); /*=0*/ MLOGIC(ISIN): Beginning execution. MLOGIC(ISIN): Parameter VLIST has value vrf_ordval_dif_acs_p vrf_ordval_dif_mix_1 vrf_ordval_dif_mix_2 vrf_ordval_dif_p vrf_ordvol_dif_p vrf_ordvol_dif_p_d vrf_val_dif_p MLOGIC(ISIN): Parameter VAR has value vrf_ordnet_dif_acs_p MLOGIC(ISIN): %LOCAL I ISIN MLOGIC(ISIN): %LET (variable name is N_VARS) MLOGIC(ISIN): %LET (variable name is ISIN) MLOGIC(ISIN): %DO loop beginning; index variable I; start value is 1; stop value is 7; by value is 1. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 2; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 3; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 4; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 5; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 6; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 7; loop will iterate again. MLOGIC(ISIN): %IF condition &var.=%scan(&vlist.,&i) is FALSE MLOGIC(ISIN): %DO loop index variable I is now 8; loop will not iterate again. NOTE: Line generated by the macro variable "ISIN". 1 0 - 180 MPRINT(ISIN): 0 MLOGIC(ISIN): Ending execution.
ERROR 180-322: Statement is not valid or it is used out of proper order.
... View more