SAS proc SQL:在单词"Month"或"Month"前面提取数字



我想从字符串中提取一个数字,其中它后面紧跟单词"Month"或"Month"。

搜索应不区分大小写,要查找的文本通常如下所示

No interest 18 months, no promo payments due = 18 
No interest  24 months, no promo payments due = 24 
No interest  12 months, no promo payments due = 12

db2我将其用于:

xmlcast(xmlquery('let $r := fn:replace($s, ".* (d+) *month.*", "$1", "i") return if ($r castable as xs:integer) then xs:integer($r) else ()' passing ' '|| TABLE.PLAN_DESC  as "s") as int)

如何将其转换为 SASproc sql

一个简单的解决方案

input(scan(substr(myText, 1, find(myText, 'month', 'i') -1), -1), 8.)

在此

  • 带有i修饰符的find对于myText中的字符串month看起来不区分大小写
  • substr返回其前面的部分
  • scan-1作为位置返回月份之前的最后一个单词
  • input应用格式8.,将该单词读为最多 8 位数字

免責聲明

  • 此代码未经过测试
  • 它只会在字符串中找到一次出现month
  • 它还会在monthly前面找到一个数字,例如

这是一个以不太优雅但非常直观的方式解决问题的解决方案:

搜索第一次出现的"月"(也会找到"月"(嗯,"月*"((。记录其开始的位置。 从该位置向后循环,收集数字的数字。 遇到既不是数字也不是空白的字符时,请停止。存储号码。 对字符串的其余部分重复此操作,直到不再出现"month"。

data test_data;
infile datalines truncover;
input testcase $200.;
datalines; 
No interest 18 months, no promo payments due = 18 No interest 24 months, no promo payments due = 24 No interest 12 months, no promo payments due = 12
jfjfjfjf1monthfjfjfj2months
jfjfjfjf1 monthfjfjfj 2 months
;
data extract_numbers;
set test_data;
length number numbers $ 1000.;
string=testcase;
do while (find(string, 'month', 'i')>0);
monthpos=find(string, 'month', 'i');
number="";
do i=monthpos-1 to 0 by -1;
character=substr(string,i,1);
if anydigit(character)=1 then number=cat(strip(character), strip(number));
else if character ne " " then do;
if numbers="" then numbers=strip(number);
else numbers=cat(strip(numbers),"-", strip(number));
string=substr(string,monthpos+5);
leave;
end;
end;
end;
keep testcase numbers;
run;

最新更新