String SAS:如果字符串中的第一个字等于另一个变量中的一个字,如何删除它
我有String SAS:如果字符串中的第一个字等于另一个变量中的一个字,如何删除它,string,word,sas,String,Word,Sas,我有variable1字符串,如“asdfsad你做什么”,“qwer你叫什么名字”,“Zebra” 和variable2带字符串“asdfsad”、“qwer”、“Animal” 如果variable1中的第一个单词等于variable2中的单词,我想从字符串中删除它。到目前为止,我唯一能想到的是分别替换每个单词: i、 e.variable1=tranwrd(variable1,“asdfsad”和“”)等等。但是我有很多词要替换 非常感谢您的帮助。像这样的东西怎么样: data sampl
variable1
字符串,如“asdfsad你做什么”,“qwer你叫什么名字”,“Zebra”
和variable2
带字符串“asdfsad”、“qwer”、“Animal”
如果variable1中的第一个单词等于variable2
中的单词,我想从字符串中删除它。到目前为止,我唯一能想到的是分别替换每个单词:
i、 e.variable1=tranwrd(variable1,“asdfsad”和“”)代码>等等。但是我有很多词要替换
非常感谢您的帮助。像这样的东西怎么样:
data sample;
length variable1 variable2 $100;
variable1= "asdfsad What do you do"; variable2 = "asdfsad"; output;
variable1= "qwer What is your name"; variable2 = "qwer"; output;
variable1= "Zebra" ; variable2 = "Animal"; output;
run;
data fixed;
length first_word $100;
set sample;
first_word = scan(variable1,1);
if first_word eq variable2 then do;
start_pos = length(first_word) + 1;
variable1 = substr(variable1,start_pos);
end;
run;
这将用于匹配整个第一个单词。它会在剩下的文本中留下空格或其他标点符号,但如果您愿意,您应该能够轻松地进行更改
如果你的问题是一个字符一个字符地匹配,而不是在整个第一个单词上匹配,那么这将是一个非常不同的问题,我建议你发布一个新问题。如果你对tranwrd的结果感到满意,你也可以使用它。你只需要小心空格
variable1 = strip(tranwrd(variable1, strip(variable2), ''));
对于数千个单词来说,这可能不是有效的或可行的,但您可以通过以下方式使用Perl正则表达式(例如s/search/replacement/
)
正则表达式中的^
符号(在prxparse
中构造)确保它仅在单词开头匹配,|
符号使其成为“或”匹配,\s+
匹配一个或多个空格字符(这就是为什么在我的示例中,“食物”不匹配的原因).这也可以删除除第一次出现以外的其他出现。很抱歉,我接受答案太晚了-但我在过去两个月一直在使用此选项-谢谢!或者,您可以编写如果scan(variable1,1)eq variable2,那么variable1=substr(variable1,index(variable1,scan(variable1,2))代码>。这将删除所有分隔前两个单词的空格、破折号等(但不适用于“动物农场”)
if scan(variable1,1)=variable2 then
variable1=substr(variable1,index(variable1," "));
/* words to match delimited by "|" */
%let words = asdfsad|qwer|Animal|foo|bar|horse;
/* example data */
data example;
infile datalines dlm=',' dsd;
input string: $256.;
datalines;
asdfsad What do you do
qwer What is your name
Zebra
food is in the fridge
foo A horse entered a bar
;
run;
/* cleaned data */
data example_clean;
set example;
/*
regular expression is:
- created once on first row (_n_ = 1)
- cached (retain regex)
- dropped at the end (drop regex).
*/
if _n_ = 1 then do;
retain regex;
drop regex;
regex = prxparse("s/^(&words)\s+//");
end;
string = prxchange(regex, 1, string); /* apply the regex (once) */
run;