我试图利用宏变量(通过%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)));
提前感谢您提供任何/所有帮助。
答案 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
不存储数字,但会存储您在屏幕上看到的文字,并且在定义YRMM
或QTR
之前,该数字无法解析。
%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.);
%let yrmm = %sysfunc(&eolm.,yymmn6.);
%let qtr = %sysfunc(&eolm.,yyq6.);
%put &=yrmm &=qtr;