2015-10-12 5 views
3

У меня есть требование прочитать строку с одинарными кавычками и без кавычек из макроса retrieve_context.Удаление одиночных кавычек из строки в SAS

Во время вызова макроса, пользователи могут называть его одинарные или без кавычек, как показано ниже:

%retrieve_context('american%s choice', work.phone_conv, '01OCT2015'd, '12OCT2015'd) 
%retrieve_context(american%s choice, work.phone_conv, '01OCT2015'd, '12OCT2015'd) 

Как прочитать первый параметр в макро без единой цитаты?

Я пробовал %conv_quote = unquote(%str(&conv_quote)), но это не сработало.

+0

Трудно сказать, что вы на самом деле спрашиваете, но вы, вероятно, хотите функцию DEQUOTE(). – Tom

ответ

3

Вы столкнулись с одним из различий между макросами и языком шагов данных.

В макросах есть понятие «цитирование», следовательно, функция макроса %unquote. Однако это не относится к традиционным символам " или '; макрокотирование - это отдельная вещь, не имеющая никаких кавычек (в некоторых контекстах используются некоторые виды символов, но они больше похожи на заполнители). Они исходят из таких функций, как %str, %nrstr и %quote, которые символизируют определенные вещи в макропеременной, чтобы они не анализировались до того, как они были предназначены.

В большинстве контекстов, хотя, Макроязык не очень обращают внимание на ' и " символов, за исключением того, чтобы идентифицировать строку в кавычках в определенных контекстах синтаксического анализа, где это необходимо сделать так, чтобы все заработало логически. Следовательно, %unquote ничего не делает о кавычках; они просто рассматриваются как обычные символы.

Вам нужно вместо этого вызвать функцию шага данных, чтобы удалить их (или некоторые другие вещи, но все они сложнее, например, с использованием различных комбинаций %substr и %index). Это делается с помощью %sysfunc, например, так:

%let newvar = %sysfunc(dequote(oldvar)); 

Dequote() является функцией шага данных, который выполняет в основном ту же самую функцию, что и %unquote, но и для обычных символов котировочных (", ').В зависимости от вашего конечного использования вам может потребоваться больше, чем это; Том покрывает некоторые из этих возможностей.

+0

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

+0

@RobertPenridge Как это вводит в заблуждение? Они делают более или менее то же самое, не так ли, за исключением того, что '% unquote' удаляет макросы« цитаты », которые не являются« символами, но концептуальными ». В обоих случаях они удаляют их. Надеюсь, остальная часть ответа заставит разница ясно? – Joe

+0

Я думаю, что для людей, которые сталкиваются с макросами, это хорошо, но они не те, которые будут полезны вашему ответу. Для надуманного примера рассмотрим 'dequote (« this »,« string »)' vs ''% unquote (% str (this),% str (string) "'. Я уверен, что могу придумать кучу других примеров, где они ведут себя по-другому. Как насчет вложенных макрокоманд? = in% str (the) middle; '.% unquote работает в магии в середине строки, а не удаляет цитаты извне ... idk ... –

3

Если пользователи снабжают ваш макрос значением, которое может включать или не включать внешние кавычки, то вы можете использовать функцию DEQUOTE(), чтобы удалить кавычки, а затем добавить их туда, где они вам нужны. Так что, если ваш макрос определен как имеющий следующие параметры:

%macro retrieve_context(name,indata,start,stop); 

Затем, если вы хотите использовать значение NAME в шаге данных вы можете использовать:

name = dequote(symget('name')); 

Если вы хотите использовать значение для генерации предложения WHERE, вы можете использовать макрос% SYSFUNC() для вызова функции DEQUOTE(). Так что-то вроде этого:

where name = %sysfunc(quote(%qsysfunc(dequote(%superq(name))))) 

Если пользователи буквально переходящая в строках с % вместо одинарные кавычки то первое, что вы, вероятно, нужно сделать, это заменить проценты с одинарными кавычками. Но не забудьте сохранить макрокоманду результата, иначе вы можете столкнуться с неуравновешенными кавычками.

%let name=%qsysfunc(translate(&name,"'","%")); 
+0

В макрокоманде нет необходимости указывать аргументы в этом вызове. Значение NAME должно быть указано при вызове макроса. Строка '' '' 'не нужна макрокоманда, и также не имеет значения' '%" ', так как процент сразу следует двойной кавычкой. Перевод преобразует проценты в одинарные кавычки и двойные кавычки в двойные кавычки. На самом деле не имеет значения, что у него двойные кавычки дважды. Неважно, совпадает ли он с первым или вторым, поскольку оба переведены в двойные кавычки. – Tom

+0

Символы двойной кавычки делают так, что вам не нужно беспокоиться о макросе, цитирующем одну цитату или процент. – Tom

+0

О, я думаю, я вижу: вы избегаете проблем с зависанием 'или%. Понял, спасибо! Я не думал о побочном эффекте цитат. – Joe

Смежные вопросы