【问题标题】:SAS libref not recognized in macro loopSAS libref 在宏循环中无法识别
【发布时间】: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 中使用逗号作为分隔符,而是使用类似 | (管道)在文件名中无效。

标签: sas sas-macro


【解决方案1】:

或许可以试试:

out=testdb.%unquote(&value) 

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

【讨论】:

  • 这解决了问题。 %str 引用了该值(不可见的位旋转),并且 proc 导入无法将文本识别为人眼所见。取消引用删除了位旋转。无论哪种方式,&value 的文本看起来都一样,但事实并非如此。
【解决方案2】:

奇怪的错误。我无法固定它。我的猜测是它与 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多