我想从字符串中提取一个数字,其中它后面紧跟单词"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;