1 Вопрос: CALL SYMPUT символьный операнд был найден в функции% EVAL

вопрос создан в Wed, May 8, 2019 12:00 AM

В настоящее время я пытаюсь создать макрос, который устанавливает части строки в список глобальных переменных, где части строки разделяются знаком "-", поэтому, например, 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, где требуется числовой операнд. Условие было:        &Ампер;. Расколы р>     

0
  1. Пожалуйста, четко покажите, каковы ваши входные данные и что вы хотите в качестве выходных данных. Это действительно не ясно, что вы пытаетесь сделать. Если вы начинаете с макропеременных, покажите операторы% LET для назначения начальных значений. Если ваши выходные данные являются макропеременными, то покажите операторы% LET, которые демонстрируют ожидаемый результат для данного ввода. Если вход или выход является набором данных, покажите шаг данных, который создает набор данных.
    2019-05-08 17: 21: 49Z
  2. Обычно не очень полезно устанавливать список макропеременных. Почему бы просто не оставить значения в одной макропеременной в виде строки с разделителями и извлекать каждое значение по мере необходимости?
    2019-05-08 17: 31: 26Z
1 ответ                              1                         

Не уверен, что вопрос, но причина вашей ошибки в том, что вы пытаетесь использовать макро-переменную 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;
    
2
2019-05-08 17: 34: 05Z
  1. Это определенно более элегантно, чем то, что у меня было с countc и всем этим mumbo jumbo, но все равно сталкивается с проблемой, которая возникает, когда я выполняю sysfunc (countw (col & I., -)) ;, он думает о col1, col2, col3 как о отдельной строке, а не о той переменной, какой я хочу ее видеть. Я подумаю о способе оставить все как есть, а затем обновлю, если я придумаю способ, который лучше без необходимости возиться со всем этим.
    2019-05-08 17: 47: 39Z
  2. Вот почему я сказал НЕ помещать данные в серию макропеременных. Чтобы использовать переменную I в качестве конца ИМЕНИ макропеременной и получить ЗНАЧЕНИЕ макропеременной, вам нужно добавить дополнительные символы &. %let i=1; %put Value of col&i is "&&col&i";
    2019-05-08 19: 24: 49Z
источник размещен Вот