从不在SAS中工作的CSV文件导入单个值

从不在SAS中工作的CSV文件导入单个值,sas,Sas,我试图使用一个宏从CSV文件中检索单个值。我已经编写了一个宏,如果只有一个CSV文件,它可以很好地工作,但是当我必须对多个文件运行它时,它不能提供预期的结果。如果有多个文件,它将返回每个迭代中最后一个文件的值 %macro reporting_import( full_file_route ); %PUT The Source file route is: &full_file_route; %PUT #########################################

我试图使用一个宏从CSV文件中检索单个值。我已经编写了一个宏,如果只有一个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”的数据集中

在我刚刚运行的一个示例中,一个文件包含01-JUN-2015,另一个文件包含02-JUN-2015。但代码在日志文件中返回的是:

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
##############################################################
源文件路由为:\FOO1.csv
##############################################################
来源报告期规定:报告日期:2015年6月2日
##############################################################
源文件路由为:\FOO2.csv
##############################################################
来源报告期规定:报告日期:2015年6月2日
##############################################################
有人知道为什么会这样吗?或者有没有更好的方法来解决这个问题

更新:


如果我从宏中删除代码并为每个输入文件手动运行它,那么它就可以完美地工作。因此,它一定与宏覆盖值有关。

我不太清楚文件之间的连接。但是,与导入CSV文件然后搜索字符串不同的是,您是否可以使用将CSV文件上的grep搜索结果保存到数据集,然后仅读取结果

更新:

我尝试在本地复制您的问题,如果我使用如下呼叫提示设置
file\u指示器
,而不是将您的
设置为:file\u指示器
,则我会成功:

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;

调用执行有棘手的时间问题。当它调用宏时,如果该宏从数据集变量生成宏变量,最好将宏调用封装在%NRSTR()中。这样,callexecute生成宏调用,但实际上并不执行宏。因此,请尝试将call execute语句更改为:

call execute('%nrstr(%%)reporting_import('||filename||')');

我发布了一个更长的解释。

这是一个有趣的方法,我肯定会研究它,但我认为这让这个非常简单的问题变得有点太复杂了。如果不使用call execute并每次调用宏,会发生什么?另外,您是否可以编写一个数据步骤,以仅读取第一行的方式读取CSV文件?
call execute('%nrstr(%%)reporting_import('||filename||')');