我遇到了一个奇怪的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));
提前感谢您的帮助!
约翰
答案 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));