sas make каталог с мнемоникой в ​​имени папки - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь создать папку с символом "&" в имени

Я пробовал функцию% superq, которая, кажется, правильно интерпретирует макропеременную

x "cd     c:\Users\avibe_000\Dropbox\htdocs\Landa2018\LDPdepartments\";                                                                 
data _null_;                                                                                                                            
call symput('mv1','Smith&Jones');                                                                                                       
 run;                                                                                                                                   
%let testmv1=%superq(mv1);                                                                                                              
%put  &testmv1  ;                                                                                                                       
x "mkdir &testmv1";  

Код работает, но создает папку «Смит», а не «Смит и Джонс», как ожидалось

Ответы [ 4 ]

0 голосов
/ 04 апреля 2019

@ Том Хороший ответ.
И вы просто были так замкнуты на свой лад:

data _null_;
    call symput('mv1','d:\Users\avibe_000\Dropbox\htdocs\Landa2018\LDPdepartments\Smith&Jones');
run;

%let testmv1=%str(%")%superq(mv1)%str(%");
%put &testmv1;
x mkdir &testmv1;
0 голосов
/ 09 февраля 2019

Макропроцессор пытается обработать макро-триггеры внутри двойных кавычек.Но это не внутри одинарных кавычек.Кроме того, командной строке Windows понадобятся кавычки вокруг значения с &.

>mkdir a&b
'b' is not recognized as an internal or external command,
operable program or batch file.

>mkdir "a&b"

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

data _null_;
  call symputX('command',quote('mkdir "Smith&Jones"',"'"));
run;
x &command ;
0 голосов
/ 09 февраля 2019

Вы можете использовать макрос mf_mkdir в библиотеке Boemska macrocore - здесь также используется dcreate() и рекурсивно создаются все необходимые подкаталоги.Он также поставляется в виде макро-функции (поэтому может использоваться практически в любом месте вашего кода).

/* import and compile (or go there and copy paste into your code */
filename mc url "https://raw.githubusercontent.com/Boemska/macrocore/master/base/mf_mkdir.sas";
%inc mc;

/* execute */
%mf_mkdir(/tmp/this %nrstr(&) that)

результат:

enter image description here

Отказ от ответственности - я работаю на Boemska!Но я все время использую этот макрос, он меня никогда не подводит.

0 голосов
/ 09 февраля 2019

Функция DCREATE создаст подпапку.В макросе используйте nrstr для передачи неразрешенного значения в функцию.%SUPERQ не является, по сути, для присвоения значения, но для извлечения значения как есть на основе имени макропеременной.

filename parent 'C:\Temp';
%put NOTE: parent(path)=%qsysfunc(pathname(parent));

%let rc = %qsysfunc(DCREATE(%nrstr(Smith&Jones),parent));

filename sj 'C:\Temp\Smith&Jones';
%put NOTE: sj(path)=%qsysfunc(pathname(sj));
...