Hi there, I'm trying to implement a simple functionality in a more complez macro and I'm having a hard time making it work properly. The input is a variable containing several numbers concatenated in a string and separated by commas. I want to separate the numbers, assign their value with certain format to a specific column and then concatenate all the non-missing column values. I'm first counting the number of elements of my input variable value and then scaning each of them in a loop so I can assign their value to a specific array element. Then, in a different loop (to be sure of following a certain order while the input could be disordered) I check non-missing values and concatenate them. Here is the code: proc format;
value charformat
1 = 'AAA'
2 = 'BBB'
3 = 'CCC'
4 = 'DDD'
5 = 'EEE'
6 = 'FFF'
7 = 'GGG'
8 = 'HHH'
9 = 'III'
10 = 'JJJ'
11 = 'KKK'
12 = 'LLL'
13 = 'MMM'
14 = 'NNN'
15 = 'OOO'
;
run;
data test1;
infile datalines delimiter='';
length testvariable $100;
input testvariable $;
datalines;
5,8,15
1
1,3
1,2,3
2,3
3,1,2
2,15
11,5
7,1,9
13,2
14
;
run;
options mlogic mprint symbolgen;
%macro multiple(var);
data test2;
set test1;
length all_options $200;
array options [15] $100;
/* We count the number of elements on the list */
elements = count(&var,',')+1;
call symputx('endloop', elements);
%if "&var" ne ' ' %then %do;
/*From 1 to the number of elements*/
%do i=1 %to &endloop;
/* We scan the i-th element of the list and turn it into a numeric value*/
item = trim(left(scan(&var,&i,',')))*1;
/* With the scaned element we give value to the item-th element of the array options and apply an specific format */
if item ne . then options[item] =trim(left (put(item,charformat.)));
%end;
/* We concatenate all non-zero values from the array */
%do j=1 %to 15;
if all_options ne ' ' and options[&j] ne ' ' then all_options = trim(left(all_options)) ||'-'|| trim(left(options[&j]));
if all_options eq ' ' then all_options = options[&j];
%end;
%end;
run;
%mend;
%multiple(testvariable); However, the execution finishes without errors and only the first element is scanned ('item' value should be the last element of the list as it is overwritten at every loop step and it remains equal to the first element when the execution finishes, and only this element is saved in the array). See the obtained output (click to enlarge): Do you have an idea on what may be causing this issue? Something obvious in the code that I might change? Thanks for any suggestions!!
... View more