Имена SAS с префиксом не работают

Я пытался получить все переменные fname с префиксом TIME_INTERVAL. Однако похоже, что следующий оператор put ничего не выводит. Мне было интересно, в чем причина?

%LET TIME_INTERVAL='MINUTE15';
data _null_;
set filenames;
by fname;
if fname =: "&TIME_INTERVAL";
put fname;
run;

Однако, если я поставлю оператор put над оператором if, он сможет правильно вывести:

%LET TIME_INTERVAL='MINUTE15';
data _null_;
set filenames;
by fname;
put fname;
if fname =: "&TIME_INTERVAL";
run;

Обновлять:

Содержимое имен файлов набора данных:

MINUTE15_group0.csv
MINUTE15_group1.csv
MINUTE15_group2.csv
MINUTE15_group3.csv
MINUTE15_group4.csv
MINUTE15_group5.csv
MINUTE15_group6.csv
MINUTE15_group7.csv
MINUTE15_group8.csv
MINUTE5_group0.csv
MINUTE5_group1.csv
MINUTE5_group2.csv
MINUTE5_group3.csv
MINUTE5_group4.csv
MINUTE5_group5.csv
MINUTE5_group6.csv
MINUTE5_group7.csv
MINUTE5_group8.csv
SECOND5_group0.csv
SECOND5_group1.csv
SECOND5_group2.csv
SECOND5_group3.csv
SECOND5_group4.csv
SECOND5_group5.csv
SECOND5_group6.csv
SECOND5_group7.csv
SECOND5_group8.csv

sas
person Jinhua Wang    schedule 03.08.2017    source источник
comment
Ни в одном из ваших значений FNAME нет одинарных кавычек, как в вашей макропеременной.   -  person Tom    schedule 03.08.2017
comment
Я думаю, что одинарная кавычка просто означает строку?   -  person Jinhua Wang    schedule 03.08.2017
comment
Все является строкой для макропроцессора.   -  person Tom    schedule 03.08.2017


Ответы (1)


Вы попросили SAS искать имена файлов, начинающиеся с 'MINUTE15', но я думаю, что на самом деле вы хотели вместо этого искать имена файлов, начинающиеся с MINUTE15.

Все является строкой для процессора макросов, поэтому нет необходимости добавлять кавычки вокруг постоянного текста в коде макроса. Если вы добавите их, они станут частью кода, который генерируется и передается SAS для запуска. Итак, ваша программа сгенерировала этот оператор IF.

  if fname =: "'MINUTE15'";

Вы можете удалить одинарные кавычки.

%LET TIME_INTERVAL=MINUTE15;
data _null_;
  set filenames;
  if fname =: "&TIME_INTERVAL";
  put fname;
run;

Или убрать двойные кавычки.

%LET TIME_INTERVAL='MINUTE15';
data _null_;
  set filenames;
  if fname =: &TIME_INTERVAL;
  put fname;
run;
person Tom    schedule 03.08.2017
comment
В чем разница между %LET TIME_INTERVAL=MINUTE15; и %LET TIME_INTERVAL='MINUTE15';? - person Jinhua Wang; 03.08.2017
comment
Второй сохранит одинарные кавычки в переменной макроса. - person Tom; 03.08.2017
comment
Но тогда зачем нам цитата в if fname =: "&TIME_INTERVAL";? - person Jinhua Wang; 03.08.2017
comment
В коде SAS вам нужно использовать кавычки вокруг строковых литералов, чтобы он не искал переменную с именем MINUTE15. Но обработка макросов используется только для генерации кода SAS. Вам просто нужно убедиться, что сгенерированный код является допустимым синтаксисом SAS и соответствует тому, что вы хотели сгенерировать. - person Tom; 03.08.2017