阻止SAS试图解决&宏字符串

时间:2017-10-03 12:18:14

标签: sas sas-macro

我正在运行一个进程,列出我想要检查修改日期的作业。我在数据集中列出作业,然后将这些作业传递给带有数字的宏变量。

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(“&”),但仍然遇到了问题。

2 个答案:

答案 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);