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));