Я борюсь с тем, как я могу создать вывод, когда использую цикл выполнения макроса в SAS. На обычном шаге данных я могу создать следующий набор данных с переменными i и var для «печати» в окне вывода, выполнив следующие действия:

data example;
    do i=1 to 4;
    var = 2+i;
    output;
run;

Что создаст в окне вывода

Obs    i     var
  1    1       3
  2    2       4
  3    3       5
  4    4       6

Теперь моя проблема заключается в том, что я использую цикл выполнения макроса и, похоже, не могу сделать то же самое, что и в обычном шаге данных (т.е. не могу отобразить свой результат в окне вывода). Цель моего макроса — добавить «_new» в конец каждого имени переменной (ABCD) из списка, а затем мне нужно, чтобы это отображалось в окне вывода.

%let myvarlist=A B C D;

%macro create_new;
    %let mlength=%countlength(&myvarlist);
    %let suffix=new;

    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
        %let my_new_varlist=&var_n._&suffix;
    %end;
%mend;
%create_new

Самое близкое, что я мог сделать, это поставить %put &my_new_varlist; прямо перед оператором %end, но это помещает его в окно журнала. Я попытался вставить цикл do в шаг данных, а затем использовать proc print, но это не сработало.

Макрос %countlength — это макрос, который я использую для подсчета количества переменных в моем списке. Код для него:

%macro countlength(char);
  %local num inputword;

  %let num=1;
  %let inputword=%qscan(&char,&num,%str( ));
      %do %while(&inputword NE);
          %let num=%eval(&num+1);
          %let inputword=%qscan(&char,&num,%str( ));
      %end;
  %eval(&num-1);

%mend;
1
user84226 7 Авг 2015 в 01:03
3
Я не думаю, что есть способ легко сделать это. Вы можете создать шаг данных и распечатать его. Интересно, что вы пытаетесь сделать в целом.
 – 
Reeza
7 Авг 2015 в 03:26
Да, очень странная просьба. Почему бы просто не заполнить таблицу, а затем использовать свой любимый метод для вывода на экран вывода?
 – 
Robert Penridge
10 Авг 2015 в 21:38

2 ответа

Я не думаю, что только макроязык можно использовать для записи в окно вывода, потому что это не его работа. Его работа (в основном) заключается в создании кода SAS. Однако код SAS может записывать в окно вывода. Возможно:

data _null_ ;
  file print ;
  put "&my_new_varlist" ;
run ;

Предлагаем вам взглянуть на служебный макрос Ричарда Девензиа %seplist. Это очень хороший подход к добавлению префиксов/суффиксов/разделителей в списки. http://www.devenezia.com/downloads/sas/macros /index.php?m=сеплист

1
Quentin 7 Авг 2015 в 12:43

Существуют глобальная таблица макросимволов и локальная таблица макросимволов, макропеременная &num, созданная в макропрограмме countlength, является локальной макропеременной, она будет удалена из локальной таблицы после завершения выполнения countlength, поэтому &num нельзя использовать для вызова макропрограммы ( создать новое). Ваш код может быть изменен как:

%macro countlength(char);
  %let num=1;
  %let inputword=%qscan(&char,&num,%str( ));
      %do %while(&inputword NE);
          %let num=%eval(&num+1);
          %let inputword=%qscan(&char,&num,%str( ));
      %end;
  %global mlength;    
  %let mlength=%eval(&num-1);

%mend;

%let myvarlist=A B C D;

%macro create_new;
    %countlength(&myvarlist)
    %let suffix=new;
    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
        %let my_new_varlist=&var_n._&suffix;
        %put &my_new_varlist;
    %end;
%mend;
%create_new

Кроме того, countw — это функция SAS для подсчета количества слов. Вы можете использовать напрямую.

%macro create_new;
    %let mlength=%sysfunc(countw(&myvarlist));
    %let suffix=new;

    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
        %let my_new_varlist=&var_n._&suffix;
        %put &my_new_varlist;
    %end;
%mend;
%create_new

EDIT: Если я правильно понял ваш вопрос, возможно, это коды.

%let myvarlist=A B C D;
%macro create_new;
    %local mlength sufix n;
    %let mlength=%sysfunc(countw(&myvarlist));
    %let suffix=new;
    data want;
    %do n=1 %to &mlength;
        %let var_n=%qscan(&myvarlist,&n);
         my_new_varlist="&var_n._&suffix";
         output;
    %end;
    run;
%mend;
%create_new
0
Shenglin Chen 7 Авг 2015 в 03:41
Я ценю помощь. Хотя я действительно ищу помощи в том, как создать вывод (в окне вывода, а не в журнале), который даст мне список переменных A_new, B_new, C_new, D_new. Просто положить %put &my_new_varlist; - это не совсем то, что я ищу :)
 – 
user84226
7 Авг 2015 в 03:07