Непревзойденная проблема с кавычками в SAS

#sas #quotation-marks

#sas #кавычки

Вопрос:

Как всем известно, SAS требует особого внимания к кавычкам внутри предложения.

Например.

 %let quoted="I'd like to";
data temp;
    set temp;
    quoted="amp;quoted";
run;
  

при отправке обнаружена ошибка.

На самом деле мне нужно скопировать данные в один набор данных из другого, в котором много записей, содержащих кавычки. При назначении возникают ошибки, и выполнение шага данных прекращается, в результате чего остальная часть кода становится недействительной. Таким образом, в этом случае невозможно изменить исходный набор данных, добавив дублирующиеся кавычки, что не имеет смысла.

Итак, вместо того, чтобы добавлять дублированный, например, «Я хотел бы», есть ли какой-либо другой способ избежать ошибки или продолжить выполнение шага данных?

Спасибо,

Комментарии:

1. Вам нужно будет опубликовать свой код. Если в текстовых переменных есть кавычки, нет проблемы с «копированием данных из одного набора данных в другой», потому что их значения никогда не отображаются в коде.

Ответ №1:

При использовании макроязыка (включая команду %let) вы не хотите использовать кавычки для идентификации текстовых строк. Чтобы поместить одинарную кавычку в строку, вы должны использовать одну из функций маскировки утилиты макрокоманд, таких как %str(). Правильный синтаксис для размещения одной несогласованной кавычки в переменной макроса с использованием %let показан ниже. Символ% перед одинарной кавычкой является управляющим символом, указывающим SAS, что следующий символ (одинарная кавычка) следует использовать в качестве литерала. Также обратите внимание, что я удалил двойные кавычки из %let, поскольку они не требуются.

 %let quoted=%str(I%'d like to);
data temp;    
    quoted="amp;quoted";
run;
  

Приветствия
Роб

Комментарии:

1. Вы также могли бы поместить всю строку, которую хотите присвоить оператору let, в функцию %str, например: %let quoted=%str(я бы хотел); Таким образом, вы можете экранировать каждую кавычку процентом, не добавляя другую функцию %str.

2. Спасибо @Rob и @Laurent, как обычно. Ваши ответы напомнили мне о концепции маскировки.:) Я надеюсь, что смогу найти точный ответ самостоятельно, Приветствия

3. Есть ли способ сделать это, когда вы устанавливаете одну макропеременную равной другой макропеременной, которая может содержать или не содержать одинарные кавычки (т. Е. Если вы перебираете список, в котором некоторые строки содержат одинарные кавычки, а некоторые нет)?

4. @ToddBurus Да, существуют другие функции цитирования макросов, отличные от %str() , которые существуют для описанной вами цели. На первый взгляд я не помню, какой из них правильный, но я уверен, что если вы опубликуете новый вопрос, кто-нибудь из людей, которые лучше меня разбираются в цитировании макросов, сможет ответить довольно быстро.

5. @RobertPenridge Спасибо. Да, я смог обнаружить, что %superq() работа выполнена.

Ответ №2:

Я не уверен, чего вы пытаетесь достичь в реальной ситуации, но в приведенной выше ситуации это можно решить, удалив двойные кавычки на шаге данных.

 %let quoted="I'd like to";
data temp;
    set temp;
    quoted=amp;quoted;
run;