【发布时间】:2015-07-04 16:40:55
【问题描述】:
我遇到了一个奇怪的 SAS 怪癖,我无法弄清楚 - 希望您能提供帮助。
我有一个导入 CSV 文件的简单宏循环,由于某种原因,如果我在导入过程的“out=”部分使用 libref 语句,SAS 不会将 libref 识别为有效名称。但是,如果我在数据步骤中使用相同的 libref,它就可以正常工作。
它给出的具体错误是:“ERROR: "TESTDB." is not a valid name."
我想弄清楚这一点,因为我处理的文件非常大,并且希望避免过多地阅读它们。
这是有效的代码,其中包含一些 cmets。我通过读取文件解决了这个问题,然后在第二步将它们写入永久 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));
提前感谢您的帮助!
约翰
【问题讨论】:
-
如果您使用逗号以外的其他内容作为文件列表的分隔符,您会得到同样的错误吗?
-
您可以在打开 mprint 和 symbolgen 选项的情况下发布日志的相关部分吗?
-
为什么要使用 %QSCAN()?文件名中是否有需要引用的字符?此外,不要在宏变量 VALUES 中使用逗号作为分隔符,而是使用类似 | (管道)在文件名中无效。