I have a set of values that must be included within a macro variable. The set of values exceed the maximum amount of characters that can be stored in a macro variable (around 65K), so split the total amount of characters within multiple macro variables, and then grouped the set of macro variables as nested within a major macro variable. The code utilized to create both the first level macro variables and the major macro variable is the following: %macro max_macro(data=,var=,macro_var=);
*Determine the number of individual submacros needed;
data &data.2;
set &data end=eof;
length_var=length(cat('"',strip(&var),'"n'));
if _n_=1 then sum_length=length_var;
else sum_length+length_var;
/**max lenght macro var 65500 chars - proxy 50k so to
have margin for the additional ""n elements **/
/**as soon as reach a term where total sum
>50k then it is assigned to group+1 **/
/**Returns the largest integer less than or equal to
a numeric value expression.**/
group=floor(sum_length/50000)+1;
if eof then call symput('num_submacro',put(group,best.));
run;
%put Number of sub macros needed= %cmpres(&num_submacro);
*Macrotize the submacros*****************************;
%do i= 1 %to &num_submacro;
%global ¯o_var submacro&i;
proc sql noprint;
select cat('"',strip(&var),'"n')
into:submacro&i separated by ' '
from &data.2
where group =&i;
quit;
%end;
*Append the submacros into single master macro;
data submacro;
do i = 1 to &num_submacro.;
submacro = cats('&submacro',i);
output;
end;
run;
proc sql noprint;
select submacro into:¯o_var separated by ' ' from submacro;
quit;
%mend max_macro; /*** use the macro***/ %max_macro(data=col_tr_biggroup, var=name, macro_var=bigrams); The macro seems to generate both the sub macro variables and the major macro variable with success. The sample set is composed by 3085 observations with a length per observation of 5 characters, with a proxy of 15.425 characters in total Therefore, in the example, the macro will only generate one submacro1, which is then included in the major macro "bigrams" However, when I try to use the created macro var in the following procedure, I get the following error: proc rank data=TR_BIGGROUP groups=10 out=Rank_score;
var &bigrams;
ranks &rank_bigrams;
run;
MPRINT(NB_USE): proc rank data=TR_BIGGROUP groups=10 out=Rank_score;
SYMBOLGEN: Macro variable BIGRAMS resolves to &submacro1
SYMBOLGEN: Macro variable SUBMACRO1 resolves to "
NOTE: The quoted string currently being processed has become more than 262 bytes long. You might have unbalanced quotation marks.
ERROR: Maximum level of nesting of macro functions exceeded.
ERROR: Maximum level of nesting of macro functions exceeded.
ERROR: Maximum level of nesting of macro functions exceeded.
ERROR: Maximum level of nesting of macro functions exceeded.
ERROR: Maximum level of nesting of macro functions exceeded.
ERROR: Maximum level of nesting of macro functions exceeded.
ERROR: Maximum level of nesting of macro functions exceeded. I checked and the error in the documentation is linked to: CauseSolution The macro functions are nested more than ten times. You cannot nest macro functions more than ten times. An attempt was made to assign a macro variable to itself. A macro quoting function was used inside a %DO loop that is going beyond ten iterations. Many times a macro quoting function is used when it is not needed. If this is the case, then remove the quoting function. A. The sub macros are not nested more than 10 times as explained B.the submacro and the major have different names and so can't be assigned to themselves NOR is used any quoting function At this point I have no clue what could be generating the error. Any hints appreciated
... View more