2016-10-25 3 views
2

Я хочу хранить макросы в каталоге. Это позволяет многим макросам делиться только одним файлом, а также вводит степень разделения от пользователя.SAS: Переименование каталога макросов

Чтобы сохранить свой макрос, я запускаю программу, такие как

/* HelloWorld.sas */ 
libname pwd ".";    /* assign current directory */ 
option mstored sasmstore=pwd; /* set pwd as storage directory */ 

%macro HelloWorld() 
    /store source;   /* store compiled macro along with its source */ 
    data _null_; 
    put "Hello, World!"; 
    run; 
%mend; 

Это создает sasmacr.sas7bcat файл в каталоге, в котором HelloWorld.sas жизни. Затем я могу переместить этот файл в другой каталог, например C:\myMacros и запустить следующую программу:

/* CallHelloWorld.sas */ 
libname myMacros 'C:\myMacros'; 
option mstored sasmstore=myMacros; 

%HelloWorld(); 

Макрос HelloWorld() вызывается без ошибок.

Однако, если я хочу рассмотреть HelloWorld() макрос как часть «HelloWorld» макро ванной, я не могу просто изменить имя каталога в проводнике Windows из sasmacr.sas7bcat в HelloWorld.sas7bcat. Когда я это сделаю и снова попробую запустить CallHelloWorld.sas (после закрытия и повторного открытия SAS) макрос не будет разрешен.

1 /* CallHelloWorld.sas */ 
2 libname myMacros 'C:\myMacros'; 
NOTE: Libref MYMACROS was successfully assigned as follows: 
     Engine:  V9 
     Physical Name: C:\myMacros 
3 option mstored sasmstore=myMacros; 
4 
5 %HelloWorld(); 
    - 
    180 
NOTE: The SAS System was unable to open the macro library referenced by the SASMSTORE = libref 
     MYMACROS. 
WARNING: Apparent invocation of macro HELLOWORLD not resolved. 

ERROR 180-322: Statement is not valid or it is used out of proper order. 

ERROR: Catalog MYMACROS.SASMACR does not exist. 
NOTE: The SAS System was unable to open the macro library referenced by the SASMSTORE = libref 
     MYMACROS. 
ERROR: An error occurred during the execution of the %COPY statement. 

Как изменить имя каталога, содержащего макросы, чтобы эти макросы могли вызываться в различных программах? Можно ли назвать каталог чем-то отличным от sasmacr спереди?

ответ

2

Я не думаю, что вы можете переименовать каталог вдали от SASMACR и использовать его напрямую. Однако вы можете использовать PROC CATALOG потенциально для управления каталогом SASMACR.

Что вы хотите сделать, когда вы хотите включить конкретный макрос, скопируйте его через proc catalog из своего местоположения источника в выбранное вами местоположение SASMSTORE.

Что-то вроде:

libname myMacros 'C:\temp'; 
libname pwd '.'; 

options mstored sasmstore=pwd; 

proc catalog catalog=myMacros.HelloWorld; 
    copy out=pwd.sasmacr; 
run; 
quit; 


%HelloWorld(); 

теперь - я бы предположить, что это, вероятно, слишком; действительно нет причин иметь отдельные макрокаталоги таким образом. Если вам нравится идея отдельно включать файлы, вы можете захотеть рассмотреть макросы Autocall (где вы не храните их скомпилированными, но сохраняете их источник и компилируйте по требованию); на самом деле компиляция макроса почти ничего не стоит в SAS. Но если использовать скомпилированные макросы - это то, что вам нравится, этот метод, вероятно, лучший способ сделать это.

Конечно, я думаю, что проще будет оставить каталог SASMACR.SAS7BCAT и использовать имя каталога, чтобы определить, что это такое, а затем добавить librefs в значение параметра sasmstore.

+0

Я категорически заявляю, что есть веские причины для получения макросов в каталоге с уникальным именем. Ключ может делиться конкретными макросами проекта с другими людьми. Каталог, как представляется, является единственным контейнером, который SAS распознает. Без каталога макросы должны существовать как отдельные файлы в какой-то момент перед загрузкой. Это риск потери, модификации и т. Д. Это ограничивает контроль. Кроме того, одно имя каталога становится проблемой при работе над несколькими проектами с теми же людьми. У человека может быть несколько файлов 'sasmacr', каждый из которых соответствует другому проекту. Решение - это отдельные имена каталогов. –

+0

Из SAS: Руководство по подготовке к сертификации, раздел 4ed, глава 12, раздел «Использование хранимых скомпилированных макросов», «Sasmacr - это единственный каталог, в котором могут храниться скомпилированные макросы. Вы можете создать каталог Sasmacr в любой библиотеке SAS. не переименуйте этот каталог или его записи. " Можно ли хранить 'sasmacr' сам в каталоге, который может иметь уникальное имя? –

+0

Решение имеет несколько разных _folders_, по крайней мере, насколько я могу судить, SAS бы вы сделали. Затем libname для каждой папки. Это ответ на ваш второй комментарий: поместите каждый в уникальную папку, затем libname в каждую папку, которая эффективно описывает все, что вы описали для всех целей и задач. – Joe

2

По крайней мере, в Unix с SAS 9.4 вы можете использовать опцию SASAUTOS, чтобы указать на FILEREF, который использует движок ZIP, чтобы все определения макросов хранились в одном ZIP-файле.

Один «трюк» заключается в том, что вам нужно изменить имена файлов-членов в файле ZIP. Обычно в unix SASAUTOS требуется, чтобы исходные файлы назывались с использованием имени макроса в нижнем регистре с расширением .sas (helloworld.sas). Но для SASAUTOS для работы с ZIP-файлом члены должны быть названы с использованием имени макроса в верхнем регистре с расширением NO (HELLOWORLD).

filename mymacros zip '~/mymacros.zip'; 
options insert=(sasautos=(mymacros)) ; 

EDIT

К сожалению, этот метод заставляет SAS генерировать сообщение об ошибке: сообщения, когда исходный файл макрос не найден в файле ZIP, даже если он в конечном счете, находится в другом файле в параметре SASAUTOS путь поиска.

+1

Что-то вроде этого работает в Windows. Можно выпустить 'имя_файла mymacros застежка-молния 'C: \ myMacros \ HelloWorld.zip' fileext lowcase_memname,' ' опции SASAUTOS = (mymacros sasautos);' Однако, вы не можете запустить 'filename' заявление более чем один раз, как указано здесь: http://support.sas.com/kb/31/540.html Я изменил инструкцию 'options' на основе http://support.sas.com/kb/44/791 .html И ИМЯ_ФАЙЛ ZIP имеет варианты, приведенные здесь: http://support.sas.com/documentation/cdl/en/lestmtsref/68024/HTML/default/viewer.htm#n1dn0f61yfyzton1l2ngsa1clllr.htm –

+0

Это довольно изящное! Хороший способ поделиться библиотекой макросов или, возможно, сохранить альтернативные макро-библиотеки и указать на них. И если вы можете заблокировать ZIP-файл с паролем записи, это будет простой способ избежать случайных изменений. Это похоже на хороший способ справиться с задачей хранения макросов в одном файле. – Quentin

+0

Спасибо за подсказки по вариантам двигателя zip. «Ошибка» с блокировкой filerefs, используемой в SASAUTOS, существует там долгое время.При использовании каталогов для хранения макросов autocall я всегда использую физический путь, а не fileref в SASAUTOS из-за этого. Но чтобы воспользоваться движком ZIP, вам нужно будет использовать fileref. Если вы хотите переключить, какие наборы макросов ссылаться в один сеанс, вам нужно будет создать уникальные filerefs, а не пытаться повторно использовать общий fileref для указания на разные ZIP-файлы. – Tom

1

От DATA_NULL_ Я получил ответ на то, как использовать существующие каталоги с разными именами. Используйте оператор CATNAME. Поэтому, если у вас есть каталоги TEST.CAT1 и TEST.CAT2, вы можете использовать оператор CATNAME, чтобы сделать TEST.SASMACR конкатенацией двух макросов.

CATNAME test.sasmacr 
    (test.cat1 (ACCESS=READONLY) 
    test.cat2 (ACCESS=READONLY) 
) 
; 

Теперь вы можете указать параметр SASMSTORE в файле TEST libref.

option mstored sasmstore=test; 

Вот пример того, как можно создать такие отдельные каталоги, используя PROC CATALOG копировать элементы, которые были собраны в SASMACR каталог в каталоги с разными названиями.

libname templib '~/test/cat1'; 
libname permlib '~/test'; 
options mstored sasmstore=templib; 

%macro HelloWorld1()/store source; 
    data _null_; 
    put "Hello, World! &sysmacroname"; 
    run; 
%mend; 

%macro HelloWorld2()/store source; 
    data _null_; 
    put "Hello, World! &sysmacroname"; 
    run; 
%mend; 

proc catalog cat=templib.sasmacr ; 
    copy out=permlib.cat1; 
     select helloworld1 /et=macro; 
    run; 
    copy out=permlib.cat2; 
     select helloworld2 /et=macro; 
    run; 
quit; 

Теперь используйте команду CATNAME приковать каталоги вместе.

options mstored sasmstore=permlib; 
CATNAME permlib.sasmacr 
    (permlib.cat1 (ACCESS=READONLY) 
    permlib.cat2 (ACCESS=READONLY) 
); 

%helloworld1; 
%helloworld2; 
Смежные вопросы