2017-02-02 6 views
0

Предположим, у меня есть следующий вывод из вызова содержимое Proc:Можно ли запрограммировать содержимое цикла и создать таблицу для каждой записи?

Name Type Format 
    x 1 DATETIME 
    y 2  $ 

В зависимости от формата Я хочу вызвать различные макросы. Предположим, у меня есть два макроса,% date (var =) и% rest (var =). В конце концов, я хотел бы назвать макрос% date с именем x и макросом% rest с именем y. Надеюсь, что более или менее понятно, что я пытаюсь сделать. Спасибо!

ответ

1

Да, это возможно, но вместо того, чтобы обрабатывать отказ от PROC CONTENTS, вы обычно запрашиваете установить выходные данные из PROC CONTENTS, а затем процесс, который далее:

proc contents data=mydata out=mycontents noprint; 
run; 

Опция NOPRINT подавляет нормальную печатная продукция. Набор данных MYCONTENTS будет содержать строку для каждой переменной в наборе данных MYDATA с столбцами для type, length, format и т. Д. Затем вы можете обработать это, как хотите, и назовите свой макрос %date() или что угодно.

EDIT:

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

%macro num_macro(); 
    result = 'I''m a numeric'; 
%mend; 

%macro char_macro(); 
    result = 'I''m a character'; 
%mend; 

data in; 
    attrib datevar length=8 format=date9.; 
    attrib charvar length=$ 20; 
    attrib numvar length=8; 
run; 

proc contents data=in out=contents noprint; 
run; 

data contents_with_result; 
    length result $ 40; 
    set contents (keep = name type); 
    if type=1 then do; 
    %num_macro(); 
    end; 
    else do; 
    %char_macro(); 
    end; 
run; 

proc print; 
run; 

Это использует два маленьких макросы для инкапсуляции другого кода, необходимый для каждого типа данных, но учтите, что это не вызов макросов один раз для каждой записи в наборе данных - макросы называются точно один раз, когда шаг данных анализируется/компилируется, а затем код, созданный макросами, выполняется один раз на запись во входном наборе данных.

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

+0

Благодарим вас за ответ. Не могли бы Вы уточнить? Как бы вы использовали мои контенты? Я не уверен, в какой среде я могу назвать макросы условными по типу. Спасибо –

+1

Есть много способов скинуть кошку, но что-то вроде «data_null_; установить mycontents; if format = 'date', затем вызовите execute ('% date (var =' || name || ');'); run ", например. Вы можете найти документы для CALL EXECUTE. Это также можно сделать в более чистом макете, в зависимости от вкуса. Вы пытаетесь сгенерировать один вызов для каждой переменной или только один вызов% date для всех дат-варов и один вызов% rest для всех несрочных варов? –

+0

В качестве начала я хотел бы добавить результат столбца к выходу содержимого proc. Значение результата столбца задается путем вызова одного из двух макросов в зависимости от имени. Как бы вы это сделали? Я очень ценю вашу помощь! –