阻止 SAS 尝试在宏字符串中解析和引用

Stop SAS from trying to resolve & reference within a macro string

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

例如

Data List_Prep;
 Format Folder
        Code   0.;
 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;

它为文件夹 1 打印 %Put 语句,但文件夹 2 不能正常工作。

Folder1 = C:\FilePath\Job ABC
WARNING: Apparent symbolic reference Y not resolved.
Folder2 = C:\FilePath\Job X&Y

当我进入循环检查数据集时,它再次起作用,因此查找 Folder1、Code1 等,但我仍然收到警告。

如何停止这些警告?我已经尝试使用 %Str("&"),但问题仍然存在。

您可以使用 %superq 函数

阻止 SAS 尝试解析值中的 & 符号
%put Folder2 = %superq(Folder2);

%superq() 宏函数是屏蔽已存在于宏变量中的宏触发器的好方法。您可以记得在使用它们时引用这些值,

%put Folder1 = %superq(Folder1) ;

或者您可以调整流程以在创建它们后立即引用它们。

data List_Prep;
  length Folder Code 0;
  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 0 ;
  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 定义变量的类型和长度以匹配您附加到它的格式的副作用,因为它是您在数据步骤中引用变量的第一个地方。