SAS libref не распознается в цикле макросов

Я столкнулся со странной причудой SAS, которую не могу понять - надеюсь, вы поможете.

У меня есть простой макро-цикл, который импортирует файлы CSV, и по какой-то причине, если я использую инструкцию libref в части процедуры импорта out= out, SAS не распознает libref как допустимое имя. Но если я использую тот же libref в шаге данных, он работает просто отлично.

Конкретная ошибка, которую он выдает: "ОШИБКА: "TESTDB."Не является допустимым именем".

Я хотел бы выяснить это, потому что я работаю с довольно большими файлами и хочу избегать их чтения чаще, чем это необходимо.

Вот код, который работает, с некоторыми комментариями. Я обошел эту проблему, прочитав файлы, а затем записав их в постоянные наборы данных SAS на втором этапе, но в идеале я хотел бы импортировать файлы непосредственно в библиотеку "TESTDB". Есть идеи, как заставить SAS распознавать libref в операторе импорта out=?

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 ответа

Решение

Возможно, попробуйте:

out=testdb.%unquote(&value) 

Иногда язык макросов не заключает в кавычки значения автоматически. В результате возникают проблемы с дополнительными символами цитирования, введенными функцией цитирования (%qscan %str %bquote %superq и т. Д.).

Странная ошибка. Я не могу закрепить это. Я предполагаю, что это как-то связано с тем, как создаются макропеременные значения. Когда я переместил создание переменной значения в шаг данных и использовал 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));
Другие вопросы по тегам