在宏循环中无法识别 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 等)引入的额外引用字符导致问题。
我 运行 遇到了一个我无法理解的 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 等)引入的额外引用字符导致问题。