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
不存储数字,而是存储你在屏幕上看到的文本,并且直到 YRMM
或 QTR
被定义时数字才会被解析。
%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.);
%let yrmm = %sysfunc(&eolm.,yymmn6.);
%let qtr = %sysfunc(&eolm.,yyq6.);
%put &=yrmm &=qtr;
我正在尝试为 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
不存储数字,而是存储你在屏幕上看到的文本,并且直到 YRMM
或 QTR
被定义时数字才会被解析。
%LET EOLM= INTNX(MONTH,%sysfunc(today()),-&MonthsAgo.);
%let yrmm = %sysfunc(&eolm.,yymmn6.);
%let qtr = %sysfunc(&eolm.,yyq6.);
%put &=yrmm &=qtr;