在宏循环中无法识别 SAS 库引用

SAS libref not recognized in macro loop

我 运行 遇到了一个我无法理解的 SAS 怪癖 - 希望您能提供帮助。

我有一个导入 CSV 文件的简单宏循环,出于某种原因,如果我在导入过程的 "out=" 部分使用 libref 语句,SAS 不会将 libref 识别为有效名称。但是,如果我在数据步骤中使用相同的 libref,它就可以正常工作。

它给出的具体错误是:"ERROR: "TESTDB." is not a valid name."

我想解决这个问题,因为我处理的文件非常大,并且希望避免不必要地多次阅读它们。

这是有效的代码,其中有一些注释。我通过读取文件解决了这个问题,然后在第二步将它们写入永久 SAS 数据集,但理想情况下我想将文件直接导入 "TESTDB" 库。知道如何让 SAS 在导入过程的 "out=" 语句中识别 libref 吗?

libname testdb "C:\SAS test"; 
%let filepath = C:\SAS test\;

%macro loop(values); 
    %let count=%sysfunc(countw(&values)); 
    %do i = 1 %to &count; 
        %let value = %qscan(&values,&i,%str(,));
        proc import datafile = "&filepath.&value..csv" 
            out = &value dbms=csv replace; getnames=yes;
                     /*"out=testdb.&value" in the line above does not work*/
        run; 
        data testdb.&value; set &value; run; 
                 /*here the libref testdb works fine*/
    %end; 
%mend; 
%loop(%str(test_a,test_b,test_c)); 

在此先感谢您的帮助!

约翰

奇怪的错误。我无法固定它。我的猜测是它与 value 宏变量的创建方式有关。当我将 value 变量创建移动到数据步骤并使用 Call Symputx 时,它起作用了。

%macro loop(files); 
    /* Create macro variables for files.*/
    data _null_;
        count = countw("&files.",",");
        call symputx("count",count,"L");
        do i = 1 to count;
            call symputx(cats("file",i),scan("&files.",i,","),"L");
        end;
    run;

    /* Read and save each CSV as a sas table. */
    %do i=1 %to &count.;
        proc import datafile = "&filepath.&&file&i...csv" 
            out = testdb.&&file&i. dbms=csv replace; getnames=yes;
        run; 
    %end;
%mend; 

%loop(%str(test_a,test_b));

也许试试:

out=testdb.%unquote(&value) 

有时宏语言不会自动取消对值的引用。结果是引用函数(%qscan %str %bquote %superq 等)引入的额外引用字符导致问题。