2015-10-09 2 views
1

Я ищу способ использовать ряд значений для параметра макроса вместо одного значения. Я в основном манипулирую серией файлов в течение последовательных месяцев (с мая 2014 года по сентябрь 2015 года), и я написал макрос, чтобы воспользоваться соглашениями об именах. Тем не менее, я все еще вручную записываю месяцы, чтобы использовать макрос. Я делаю это много раз с большим количеством разных файлов с этого месяца. Есть ли способ привязать параметр к списку значений и пройти через них как массив/do-loop? Я просмотрел% ARRAY как возможность, но это, похоже, не делает то, что я ищу, если я не вижу, что это полная возможность. Я привел образец этого кода ниже.Использование ряда значений для параметра макроса SAS

%MACRO memmonth(monyr=); 
proc freq data=work.both_&monyr ; 
    table var1/ out=work.mem_&monyr; 
run; 
data work.mem_&monyr; 
    set work.mem_&monyr; 
    count_&monyr=count; 
run; 

%MEND memmonth; 


%memmonth(monyr=may14) 
%memmonth(monyr=jun14) 
%memmonth(monyr=jul14) 
%memmonth(monyr=aug14) 
%memmonth(monyr=sep14) 
%memmonth(monyr=oct14) 
%memmonth(monyr=nov14) 
%memmonth(monyr=dec14) 
%memmonth(monyr=jan15) 
%memmonth(monyr=feb15) 
%memmonth(monyr=mar15) 
%memmonth(monyr=apr15) 
%memmonth(monyr=may15) 
%memmonth(monyr=jun15) 
%memmonth(monyr=jul15) 
%memmonth(monyr=aug15) 
%memmonth(monyr=sep15) 
+0

Я бы объединил наборы данных MMMYY и создал новую переменную, используя параметр INDSNAME = variable SET. Затем вы можете запустить PROC FREQ BY MONYR; и получить один из данных с будет все подсчеты. –

ответ

1

В общем, я бы рекомендовал передать список значений в виде списка с разделителями пробелов и добавить логику цикла в макрос. Если пробелы являются допустимыми символами в значениях, используйте другой разделитель. Не используйте запятую в качестве разделителя, так как это означает, что вам нужно будет использовать макрокоманду для вызова макроса.

Итак, ваш основной макрос.

%macro memmonth(monyr); 
proc freq data=work.both_&monyr ; 
    table var1/ out=work.mem_&monyr (rename=(count=count_&monyr)) ; 
run; 
%mend memmonth; 
%memmonth(may14) 
%memmonth(jun14) 

Вы можете изменить его на это.

%macro memmonth(monyrlist); 
%local i monyr; 
%do i=1 %to %sysfunc(countw(&monyrlist)); 
    %let monyr=%scan(&monyrlist,&i); 
    proc freq data=work.both_&monyr ; 
    table var1/ out=work.mem_&monyr (rename=(count=count_&monyr)) ; 
    run; 
%end; 
%mend memmonth; 
%memmonth(may14 jun14) 

Если вы всегда хотите, чтобы обработать все месяцы в промежутке, то вы можете просто перейти в начало и конец месяца интервала.

%macro memmonth(start,end); 
%local i monyr; 
%do i=0 %to %sysfunc(intck(month,"01&start"d,"01&end"d)); 
    %let monyr=%sysfunc(intnx(month,"01&start"d,&i),monyy5.); 
    proc freq data=work.both_&monyr ; 
    table var1/ out=work.mem_&monyr (rename=(count=count_&monyr)) ; 
    run; 
%end; 
%mend memmonth; 
%memmonth(may14,sep15) 

Если у вас есть список источников, будь то текстовый файл или набор данных, вы можете использовать простой шаг данных для создания макро-вызовов. Так что если у вас есть входной набор данные с переменной MONYR тогда ваша программа драйвера будет выглядеть следующим образом:

data _null_; 
    set mylist ; 
    call execute(cats('%nrstr(memmonth)(',MONYR,')')); 
run; 

Если источник является файлом с именами, то заменить оператор SET с соответствующим входной_файлом и INPUT, заявлением. Если источником является имя каталога, посмотрите на один из многих способов SAS, чтобы прочитать имена файлов в каталоге в набор данных и использовать их для управления генерацией вызова макросов.

+0

Это идеальный ответ, но я должен быть более конкретным. Я делаю это над множеством различных макросов по многим различным программам. Есть ли способ, чтобы он ссылался на внешний источник, например текстовый файл или файл sas? Таким образом, я обновляю только одну вещь, как месяцы. Но это тоже здорово, я могу просто сохранить текстовый файл и скопировать его в подсказку параметров каждый раз, когда я его запустил, но все же предотвратил бы некоторые ошибки с моей стороны. –

+0

Если мы предположим, что ваш макрос более сложный, и вы не хотите его менять, вам необходимо создать программу-драйвер, которая собирает информацию и генерирует серию вызовов макросов. Таким образом, программа драйвера может принять имя текстового файла, имя каталога, в котором он ищет файлы определенного шаблона или набора данных SAS. Позвольте мне добавить такой вариант ответа. – Tom

+0

Это все здорово, большое спасибо. –

Смежные вопросы