Какой ваш лучший способ выйти из состояния несбалансированной котировки в BASE SAS?

StackOverflow https://stackoverflow.com/questions/107414

  •  01-07-2019
  •  | 
  •  

Вопрос

Как базовый программист 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 рекомендует решение, которое вы предложили для себя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top