SAS libref在宏循环中无法识别

时间:2015-07-04 16:40:56

标签: sas sas-macro

我遇到了一个奇怪的SAS怪癖,我无法弄清楚 - 希望你能提供帮助。

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

它给出的具体错误是:"错误:" TESTDB。"不是有效名称。"

我想解决这个问题,因为我使用相当大的文件,并希望避免阅读它们超过必要的次数。

这里有适用的代码,其中包含一些注释。我通过读取文件,然后在第二步中将它们写入永久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)); 

提前感谢您的帮助!

约翰

2 个答案:

答案 0 :(得分:2)

也许试试:

out=testdb.%unquote(&value) 

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

答案 1 :(得分:0)

奇怪的错误。我无法钉住它。我的猜测是它与如何创建宏变量有关。当我将变量创建移动到数据步骤并使用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));