我正在尝试使用从CSV文件中检索单个值的宏。我编写了一个MACRO,如果只有一个CSV文件可以正常工作,但是当我必须针对多个文件运行它时,它不能提供预期的结果。如果有多个文件,则返回每次迭代中最后一个文件的值。
%macro reporting_import( full_file_route );
%PUT The Source file route is: &full_file_route;
%PUT ##############################################################;
PROC IMPORT datafile = "&full_file_route"
out = file_indicator_tmp
dbms = csv
replace;
datarow = 3;
RUN;
data file_indicator_tmp (KEEP= lbl);
set file_indicator_tmp;
if _N_ = 1;
lbl = "_410 - ACCOUNTS"n;
run;
proc sql noprint ;
select lbl
into :file_indicator
from file_indicator_tmp;
quit;
%PUT The Source Reporting period states: &file_indicator;
%PUT ##############################################################;
%mend;
这是我执行宏的地方。每个excel文件的完整路径都作为名为“HELPERS.RAW_WAITLIST”的数据集中的单独记录存在。
data _NULL_;
set HELPERS.RAW_WAITLIST;
call execute('%reporting_import('||filename||')');
run;
在我刚刚运行的一个例子中,一个文件包含01-JUN-2015和另一个02-JUN-2015。但是代码在LOG文件中返回的是:
The Source file route is: <route...>\FOO1.csv
##############################################################
The Source Reporting period states: Reporting Date:02-JUN-2015
##############################################################
The Source file route is: <route...>\FOO2.csv
##############################################################
The Source Reporting period states: Reporting Date:02-JUN-2015
##############################################################
有人理解为什么会这样吗?或者有没有更好的方法来解决这个问题?
更新
如果我从MACRO中删除代码并为每个输入文件手动运行它,它可以正常工作。所以它必须与MACRO覆盖值有关。
答案 0 :(得分:2)
CALL EXECUTE有棘手的时间问题。当它调用一个宏时,如果该宏从数据集变量生成宏变量,最好将宏调用包装在%NRSTR()中。这样调用execute会生成宏调用,但实际上并不执行宏。因此,请尝试将您的调用执行语句更改为:
call execute('%nrstr(%%)reporting_import('||filename||')');
我发布了更长的解释here。
答案 1 :(得分:1)
我对文件之间的连接不太清楚。但是,您无法使用pipe command将CSV文件中的grep搜索结果保存到数据集,而只是在结果中读取,而不是导入CSV文件然后搜索字符串?
<强>更新强>
我尝试在本地复制您的问题,如果我将file_indicator
设置为如下所示的电话会话,而不是into :file_indicator
,那么它对我有用:
data file_indicator_tmp (KEEP= lbl);
set file_indicator_tmp;
if _N_ = 1;
lbl = "_410 - ACCOUNTS"n;
data _null_ ;
set file_indicator_tmp ;
if _n_=1 then call symput('file_indicator',lbl) ;
run;