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