Function SAS扫描功能,不包括数字字符和其他分隔符

Function SAS扫描功能,不包括数字字符和其他分隔符,function,sas,delimiter,delimiter-separated-values,Function,Sas,Delimiter,Delimiter Separated Values,我正在尝试从以下字符串中提取单词: %let rule = %str(limit <= amount and debt > 5); 但是,这也将和提取为第三个变量,将5提取为第五个变量,这是我不想要的。您知道如何将单词和(或其他一些单词,如或)和5(通常是所有数字字符)也包括在分隔符列表中吗?您需要提供一个您正在查找的所有变量名的列表,并依次搜索每个变量名,例如使用索引功能。如果同一个变量名在字符串中出现多次,您是否在意 如果此处的目标是为宏提供某种类型的输入验证,而不是在宏逻辑中

我正在尝试从以下字符串中提取单词:

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

但是,这也将
提取为第三个变量,将
5
提取为第五个变量,这是我不想要的。您知道如何将单词
(或其他一些单词,如
)和
5
(通常是所有数字字符)也包括在分隔符列表中吗?

您需要提供一个您正在查找的所有变量名的列表,并依次搜索每个变量名,例如使用
索引
功能。如果同一个变量名在字符串中出现多次,您是否在意

如果此处的目标是为宏提供某种类型的输入验证,而不是在宏逻辑中编写自己的解析器,那么尝试将
&rule
实际应用到正在查询的表中的一行可能会更简单

例如


如果
&rule
所需的任何变量不存在,则应在日志中生成一条相当清晰的错误消息。

您可以使用
TRNWORD
函数替换/删除特定单词,如
和/或

确保包含前导空格和尾随空格,以免弄乱要保持不变的变量名


您可以使用压缩功能删除运算符、小数点和所有数字

只要变量名不包含数字,这就可以工作。如果有,请从压缩函数中删除“d”修饰符,并修改宏以使用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;

拒绝将
5
作为有效单词的规则是什么?是因为他们不在清单中吗
限额债务
?你真的事先有名单吗?如果是这样,为什么要扫描字符串?这是宏的内部,用户为其设置
rule=
作为宏的参数之一。我需要能够从
规则中过滤出列名
,这些列名将是除符号
<=
和单词
或数字(如
5
)以外的所有名称。变量名中是否允许使用数字或下划线?e、 g.
myvar_1
?但我事先不知道变量的名称,用户设置了
规则
,我需要从该
规则
中过滤出变量名称。除了
、数字如
5
,这些变量名是每个单词。
data _null_;
  set mytable(obs = 1);
  where &rule;
run;
%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