SAS 宏变量问题- 'File Name value exceeds maximum length'

SAS macro variable issue- 'File Name value exceeds maximum length'

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

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

我的旧数据文件字符串结束 DATAFILE="...Files_Submitted1612\Reconcile\Q42016 校长 balances.xls"

我改成了 DATAFILE="...Files_Submitted\&yrmm.\Reconcile\&quarter.Principal 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)));

提前感谢any/all的帮助。

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

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

事实上,您最终得到的文件名类似于 "\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;

甚至(这可能有点可爱)从 &EOLM 中删除 %SYSFUNC 并让 %SYSFUNC 格式选项处理格式。注意这里 EOLM 不存储数字,而是存储你在屏幕上看到的文本,并且直到 YRMMQTR 被定义时数字才会被解析。

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