我知道SAS中有一个子字符串函数,但是有一个函数可以返回字符串中的前n个字吗?
答案 0 :(得分:2)
我不知道有哪个功能正是如此。你可以使用scott提供的函数组合,或者你可以沿着正则表达式兔子洞去做类似的事情,其中括号中的数字是你想要的单词数量:
substring = prxchange('s/((\w+ ){2}).*/\1/',-1,original_string);
这假设您的单词由字母数字字符组成,并且它们由空格分隔。 (可能还有很多其他特殊情况也可能会破坏它。)
答案 1 :(得分:2)
使用SAS 9.2及更高版本,您可以使用PROC FCMP滚动自己的功能。这将允许您封装循环并将其他提及扫描到可在任何数据步骤中重用的表单。
options cmplib=work.fns;
proc fcmp outlib=work.fns.fns;
function nwords(str $, n) $;
nstr = countw(str);
if nstr <= n then do;
return (str);
end;
else do;
attrib outStr length=$200;
outStr = "";
do i=1 to n;
outStr = strip(outStr) || " " || scan(str,i);
end;
return (outStr);
end;
endsub;
run;
quit;
data test;
str = "I went to the store to get milk and bread.";
format substrs $200.;
do i=1 to 5;
substrs = nwords(str,i);
output;
end;
run;
答案 2 :(得分:1)
没有直接的子字功能。但是,您可以使用CALL SCAN来查找单词所在的位置。
%let words=4;
data _null_;
infile datalines truncover;
input @1 text $500.;
position=0;
length=0;
do _t = 1 to &words;
call scan(text,_t,position,length);
end;
newvar = substr(text,1,position+length);
put _all_;
datalines;
The rain in Spain falls mainly in the plains
Spruce Goose is on the loose
The quick brown fox jumps over the lazy dog
;;;;
run;
注释中建议的直接解决方案(循环函数扫描调用)更容易编写,而这可以避免在将单词重新组合时调用CATX(或类似函数),因此在某些情况下执行速度更快。