我正在运行一个进程,列出我想要检查修改日期的作业。我在数据集中列出作业,然后将这些作业传递给带有数字的宏变量。
e.g。
Data List_Prep;
Format Folder
Code $100.;
Folder = 'C:\FilePath\Job ABC'; Code = '01 Job Name.sas'; Output;
Folder = 'C:\FilePath\Job X&Y'; Code = '01 Another Job.sas'; Output;
Run;
%Macro List_Check();
Data List;
Set List_Prep;
Job + 1;
Call Symput (Cats("Folder", Job), Strip(Folder));
Call Symput (Cats("Code", Job), Strip(Code));
Run;
%Put Folder1 = &Folder1;
%Put Folder2 = &Folder2;
%MEnd;
%List_Check;
它打印%put语句对于foler 1来说很好,但是文件夹2不能正常工作。
Folder1 = C:\FilePath\Job ABC
WARNING: Apparent symbolic reference Y not resolved.
Folder2 = C:\FilePath\Job X&Y
当我进入循环检查数据集时,再次,它工作,所以查找Folder1,Code1等,但我仍然收到警告。
如何停止这些警告?我已经尝试了%Str(“&”),但仍然遇到了问题。
答案 0 :(得分:2)
%superq()
宏函数是掩盖已经在宏变量中的宏触发器的好方法。你可以记得在使用时引用这些值,
%put Folder1 = %superq(Folder1) ;
或者你可以调整你的过程,在创建它们之后立即引用它们。
data List_Prep;
length Folder Code $100;
Folder = 'C:\FilePath\Job ABC'; Code = '01 Job Name.sas'; Output;
Folder = 'C:\FilePath\Job X&Y'; Code = '01 Another Job.sas'; Output;
run;
data List;
set List_Prep;
Job + 1;
length dummy $200 ;
call symputx(cats("Folder", Job), Folder);
dummy = resolve(catx(' ','%let',cats("Folder", Job),'=%superq(',cats("Folder", Job),');'));
call symputx(cats("Code", Job), Code);
dummy = resolve(catx(' ','%let',cats("Code", Job),'=%superq(',cats("Code", Job),');'));
drop dummy;
run;
P.S。不要使用FORMAT来定义变量。使用LENGTH或ATTRIB等用于定义变量的语句。 FORMAT用于将格式附加到变量,而不是用于定义它们。使用FORMAT工作的唯一原因是它具有SAS的副作用,它定义变量的类型和长度以匹配您附加到它的格式,因为它是您在数据步骤中引用变量的第一个位置。
答案 1 :(得分:1)
您可以使用%superq
函数阻止SAS尝试解析值中的&符号
%put Folder2 = %superq(Folder2);