CALL SYMPUT символьный операнд был найден в функции% EVAL - PullRequest
0 голосов
/ 08 мая 2019

В настоящее время я пытаюсь создать макрос, который устанавливает части строки в список глобальных переменных, где части строки разделяются знаком «-», поэтому, например, 672-46-246 создаст три глобальные переменные , name2, name2 и name4, которые называются 672, 46, 246 соответственно. Также есть имя1, которое является глобальной переменной всей строки. Но в любом случае я получил возможность получить всю строку в глобальную переменную, но у меня возникли проблемы с ее разделением. Могут быть и другие способы сделать это, но я пытаюсь сделать цикл for для определения количества «расщеплений», т. Е. «-», а затем подставить его под эти разбиения. Прямо сейчас я пытаюсь выяснить, сколько существует "расщеплений", но код возвращает

ОШИБКА: символьный операнд был найден в функции% EVAL или в условии% IF, где требуется числовой операнд. Условие было: и расщепляется.

Не уверен, что еще включить сюда в резюме.

Код ниже

%GLOBAL C;
%LET C=1;
DATA _NULL_;
    SET T_&scope.;
    %DO I = 1 %TO &sqlobs.;
        %GLOBAL name&C.;
        CALL SYMPUT("name&C.", COL&I.);
        %Counter(C);
        CALL SYMPUT("splits", COUNTC(COL&I., "-"));
        %DO J = 0 %TO &splits.;
            %Counter(C);
        %END;
    %END;
RUN;

ВНИМАНИЕ: Кажущаяся символическая ссылка РАЗДЕЛЕНА не разрешена. ОШИБКА: символьный операнд был найден в функции% EVAL или в условии% IF, где требуется числовой операнд. Условие было: & расщепляется.

1 Ответ

2 голосов
/ 08 мая 2019

Не уверен, что вопрос, но причина вашей ошибки в том, что вы пытаетесь использовать макро переменную SPLITS, прежде чем вы дадите ей значение. Сначала запускается макропроцессор, а затем полученный код компилируется и запускается SAS. Таким образом, ваш оператор макроса %do j=0 %to &splits; оценивается ПЕРЕД тем, как ваш шаг данных начинает выполняться, и определенно, прежде чем оператор CALL SYMPUT() сможет выполняться.

Если у вас есть список значений в макропеременной, используйте %SCAN(), чтобы выбрать отдельные значения.

%let list= 672-46-246 ;
%do i=1 %to %sysfunc(countw(&list,-));
  %let next=%scan(&list,&i,-);
  ...
%end;
...