阻止 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 定义变量的类型和长度以匹配您附加到它的格式的副作用,因为它是您在数据步骤中引用变量的第一个地方。
我是 运行 一个列出作业的进程,我想检查修改日期。我列出数据集中的工作,然后将这些工作传递给带有数字的宏变量。
例如
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
函数
%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 定义变量的类型和长度以匹配您附加到它的格式的副作用,因为它是您在数据步骤中引用变量的第一个地方。