Какой ваш лучший способ выйти из состояния несбалансированной котировки в BASE SAS?
Вопрос
Как базовый программист SAS, вы знаете суть:
Вы отправляете свой код SAS, который содержит несбалансированную кавычку, так что теперь у вас есть не только незакрытая кавычка, но также незакрытые комментарии, определения макрофункций и отсутствующий прогон;или уйти;заявление.
Какой ваш лучший способ избежать беспокойства этих несбалансированных котировок?
Решение
Руководство предприятия 3 раньше помещало следующую строку в начало автоматически сгенерированного кода:
*';*";*/;run;
однако единственный способ действительно «сбросить» все виды несбалансированных проблем — это выйти из сеанса sas и сбалансировать все, что несбалансировано, прежде чем повторно отправлять код.Использование таких быстрых (дешевых?) хаков не устраняет основную причину.
кстати, ods _all_ close;
закрывается все места назначения ods, включая место назначения по умолчанию и результаты.в интерактивном сеансе вам следует открыть его снова с помощью ods results;
или ods results on;
по крайней мере, согласно документации.но когда я проверил это на своем 9.2, это не сработало, как показано ниже:
%put sysvlong=&sysvlong sysscpl=&sysscpl;
/* sysvlong=9.02.01M0P020508 sysscpl=X64_VSPRO */
ods _all_ close;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/
ods results on;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/
Другие советы
Что касается меня, то я обычно Google для «несбалансированной котировки SAS», и в конечном итоге отправим что-то вроде этот:
*); */; /*’*/ /*”*/; %mend;
...для выхода из незакрытых комментариев, кавычек и макрофункций.
Вот тот, который я использую.
;*';*";*/;quit;run;
ODS _ALL_ CLOSE;
QUIT; RUN;
У меня была ситуация с несбалансированными котировками в макросе и единственным решением было закрыть экземпляр SAS и начать заново.
Я считаю, что это неприемлемый недостаток SAS.
Однако я использовал методы №2 и №5, и это сработало.Сначала номер 2, а затем номер 1.Я поместил их над ВСЕМ кодом, включая заголовок кода, объясняя, что делает эта программа.
Работало как шарм.
Я написал программу на Perl, которая считывает любую программу SAS и отслеживает элементы, которые должны идти парами.С помощью таких вещей, как круглые скобки, которые можно вставлять, он печатает уровень вложенности в начале каждой строки.Он должен иметь возможность отличать круглые скобки, являющиеся частью функций макроса, от скобок, которые являются частью функций шага данных, включая вызовы %sysfunc, которые находятся в среде макроса, но вызывают функции шага данных (также необходимо сделать то же самое для макроса %syscall). вызовы функций), но это можно сделать с помощью регулярных выражений.Если уровень вложенности становится отрицательным, это указывает на то, что проблема может быть где-то рядом.
Он также начинает подсчет одинарных и двойных кавычек с начала программы и определяет, является ли счетчик каждого такого символа, с которым он сталкивается, нечетным или четным.Как и в случае с круглыми скобками, он должен уметь отличать кавычки, являющиеся частью кода макроса, от кавычек, которые являются частью кода шага данных, а также от кавычек, которые являются частью литеральных строк, таких как O'Riley и %nrstr(%'%"). и не считать их, но сопоставление с образцом тоже может справиться с этим.
Если проблема несовпадающего элемента связана с кодом, который генерируется во время выполнения с помощью макрокода и поэтому отсутствует в исходной программе, то я включаю опцию mfile, чтобы записать сгенерированный код шага данных в файл, а затем запускаю Perl-скрипт. против этого кода.
Я выбрал Perl из-за его мощных возможностей сопоставления с образцом, но любой другой язык сопоставления с образцом подойдет нормально.Надеюсь это поможет.
Вы всегда можете просто выполнить команду завершения отправленных операторов и повторно отправить то, что вы пытаетесь запустить.
просто хотел повторить предложение AFHood использовать ODS _ALL_ CLOSE;
заявление.Это ключевой момент, который следует включить.И в любом случае убедитесь, что вы используете его каждый раз, когда заканчиваете работу с ODS.
В моем случае закрытие сеанса SAS сработало.Я думаю, вы можете попробовать это один раз, прежде чем пробовать другие методы, упомянутые здесь.
Да, я считаю, что официальная документация SAS рекомендует решение, которое вы предложили для себя.