Функция сканирования SAS, исключая цифры c и другие разделители - PullRequest
0 голосов
/ 20 января 2020

Я пытаюсь извлечь слова из следующей строки:

%let rule = %str(limit <= amount and debt > 5);

Однако я хочу извлечь только слова limit amount и debt (имена моих переменных). Как я могу добиться этого в SAS, не извлекая также and и 5 из строки?

Теперь у меня есть:

%let var1 = %scan(&rule., 1, '= < >')

однако это также извлекает and как третья переменная и 5 как пятая переменная, которую я не хочу. Знаете ли вы, как включить в список разделителей также слова and (или другое слово, например or) и 5 (обычно все цифры c)?

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Вы можете использовать функцию TRNWORD для замены / удаления указанных c слов, таких как and or.
Не забудьте включить начальные и конечные пробелы, чтобы не связываться с имя переменной, которую вы хотите оставить без изменений.

Вы можете использовать функцию COMPRESS, чтобы удалить операторы, десятичные точки и все числа.

Это будет работать так долго поскольку ваши имена переменных не содержат чисел. Если это так, удалите модификатор 'd' из функции COMPRESS и измените макрос так, чтобы он использовал TRNWORD для удаления чисел с начальными пробелами (например, ' 5'), поскольку переменные не могут начинаться с цифр.

следующий макрос извлечет указанное слово из вашей текстовой строки, сообщит результат в журнал и предоставит результат в макропеременной:

%macro extract_word(txt_string, w_num);
    option nonotes;
    data _null_;
        _rule = "&txt_string.";
        _var1 = tranwrd(_rule, ' and ', ' ');
        _var2 = tranwrd(_var1, ' or ', ' ');
        _var3 = compress(_var2, '^=<>.', 'd');
        _word = scan(_var3, &w_num.);
        call symputx("word&w_num.", _word, 'G');
    run;
    options notes;
    %put NOTE: Word&w_num. = &&word&w_num..;
%mEnd extract_word;

Вот результаты:

     %extract_word(%str(&rule.), 1);
NOTE: Word1 = limit
     %extract_word(%str(&rule.), 2);
NOTE: Word2 = amount
     %extract_word(%str(&rule.), 3);
NOTE: Word3 = debt
0 голосов
/ 20 января 2020

Вам нужно будет предоставить список всех имен переменных, которые вы ищете, и искать каждое из них по очереди, например, с помощью функции index. Вас волнует, если одно и то же имя переменной встречается в вашей строке более одного раза?

Если цель здесь состоит в том, чтобы обеспечить некоторую проверку ввода для вашего макроса, а не писать собственный анализатор в макросе logi c, может быть проще попробовать на самом деле применить &rule к одной строке из таблицы, к которой вы обращаетесь,

Например,

data _null_;
  set mytable(obs = 1);
  where &rule;
run;

Если какая-либо из необходимых переменных для &rule отсутствуют, это должно генерировать довольно четкое сообщение об ошибке в журнале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...