SAS宏变量问题 - '文件名值超过最大长度'

时间:2017-03-29 13:29:21

标签: sas sas-macro

我试图利用宏变量(通过%LET分配)进行PROC IMPORTS,但它导致文件名超过201个字符。 (错误:文件名值超过201个字符的最大长度)

是否有不同的方法来定义变量,以便它们作为值而不是函数传递?

我的旧数据文件字符串结束     DATAFILE =" ... Files_Submitted \ 201612 \ Reconcile \ Q42016 Principal balances.xls"

我已将其更改为     DATAFILE =" ... Files_Submitted \&放大器; yrmm \对账\&放大器;四分之一。本金balances.xls"

使用以下变量。

%LET EOLM= INTNX('MONTH',today(),-&MonthsAgo.);
%LET yrmm= COMPRESS(year(&EOLM.)||PUT(month(&EOLM.),z2.));
%LET qtr = COMPRESS(year(&EOLM.)||COMPRESS('Q'||CEIL(month(&EOLM.)/3)));

提前感谢您提供任何/所有帮助。

1 个答案:

答案 0 :(得分:3)

你实际上并没有以正确的方式传递信息 - 你混合了两个不同的东西,这导致了你的问题。

您可以在宏变量中解析这些函数的结果,或者您可以存储函数调用并将其视为您将函数键入数据步骤 - 因此请使用CATS或其他东西来组合它们。 / p>

实际上,你最终会得到像"\\path\to\COMPRESS(INTNX(MONTH..."这样的文件名,而不是这些函数的结果,因此就是你的问题。

所以,一个选择:

DATAFILE= cats("...Files_Submitted\",&yrmm.,"\Reconcile\",&quarter.,"Principal balances.xls";

这会让函数按预期提供它们的值。

另一个选项是使用%SYSFUNC来询问要在宏变量中解析的值。这是更常见的方式,但当然,对于所有目的来说,两者都没有特别好。

%LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.));

与其他两个相似。请注意,我删除MONTH周围的引号,因为%SYSFUNC调用中没有使用引号(除非您想使用引号字符本身,而不是字符串分隔符)。

%LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.);

请注意,我将格式直接放在SYSFUNC调用中;另请注意,我们不在宏变量中使用连接字符(它们只生成文本),通常您不需要使用COMPRESS(尽管并非总是如此)。

%LET qtr = %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3)));

这里我们使用%SYSEVALF进行数学运算(通常你不能在宏语法中使用非整数数学)。我们也会从Q中删除引号,然后将其排成一行。

全部放在一起:

   %let monthsAgo = 3;
   %LET EOLM= %sysfunc(INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.));
   %put &=EOLM;
EOLM=20789
   %LET yrmm= %sysfunc(year(&EOLM.))%sysfunc(month(&EOLM.),z2.);
   %put &=yrmm;
YRMM=201612
   %LET qtr =   %sysfunc(year(&EOLM.))Q%sysfunc(CEIL(%sysevalf(%sysfunc(month(&EOLM.))/3)));
   %put &=qtr;
QTR=2016Q4

当然,使用yrmm / qtr的格式更容易......

%let yrmm = %sysfunc(putn(&eolm.,yymmn6.));
%let qtr  = %sysfunc(putn(&eolm.,yyq6.));
%put &=yrmm &=qtr;

或者甚至(这可能会有点可爱)从%SYSFUNC中移除&EOLM并让%SYSFUNC格式选项处理格式化。请注意,此处EOLM不存储数字,但会存储您在屏幕上看到的文字,并且在定义YRMMQTR之前,该数字无法解析。

%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.);
%let yrmm = %sysfunc(&eolm.,yymmn6.);
%let qtr  = %sysfunc(&eolm.,yyq6.);
%put &=yrmm &=qtr;