这两天接到这样一个需求,要从短信内容中找出
短信的业务代码和名称:例如如下的一条短信
尊敬的用户,您的话机,本月消费总额:96.91元.当前余额:16.89元.亲!请回复序号获取更多服务:
61.当月生效流量包办理
103.查询本月消费明细
104.缴费记录查询
105.查询账户积分
108.查询套餐使用量
112.3G流量卡查询
1131.查询上月账单情况
0000.查询本机增值业务
但存在的问题是,短信的种类很多,好在有字段可以大致区分出来类似的回复短信,但是即便如此,还是存在很多没有业务代码的短信,查找了很多短信记录总算是总结出来一条规律就是包含业务代码的短信总是>=3行的,当然也存在=3行但是没有回复代码的短信,由于实在是缺乏剔除的规律性因此决定在取出后再做二次剔除,于是就编写了下面这段代码,后来发现取出来的还是不准确,原来还存在代码和名称用空格的方式
2/2温馨提醒,使用短信营业厅查询业务、充值交费、积分兑换优惠业务包,方便快捷、省时省心。回代码体验:
111 银联卡交费
518 数字竞猜奖30元话费活动介绍
50321 确认100积分兑换15条短信
实际上,只需要将空格替换成小数点就解决了。 最终的代码如下:
SQL> set serveroutput on
SQL> declare n number;
2 n1 number;
3 v_id varchar2(200);
4 v_content varchar2(4000);
5 begin
6 --1.先判断回车的数量 从而确定需要循环的次数
7 select (length(replace(smscontent_ys,' ','.'))-length(replace(replace(smscontent_ys,' ','.')||chr(10),chr(10),null))) into n
/* 首先计算长度减掉将回车符替换为空的长度,从而得出存在的回车数量 */
/*replace(smscontent_ys,' ','.') 将可能为空格的替换为小数点, 因为最后一行没有空格,因此需要给短信内容添加一个回车符,这样便于一次性循环取出所有的代码 */
8 from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
9 --2.找出第一个回车前还有几个非有效的小数点
10 select length(substrreplace(smscontent_ys,' ','.')||chr(10),1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1)))-
11 length(replace(substr(replace(smscontent_ys,' ','.')||chr(10),1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1)),'.',null)) into n1
12 from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
13 for i in 1..n loop --循环之前确定的次数
14 select substr(replace(smscontent_ys,' ','.')||chr(10),instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,i),instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)-instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,i)),
15 substr(replace(smscontent_ys,' ','.')||chr(10),instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)+1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1+i)-instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)) into v_id,v_content--获取id和内容
16 from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
17 dbms_output.put_line(v_id||':'||v_content); --将收集到的代码和内容打印出来以便查看是否有效。
18 end loop;
19 end;
20 /
61:当月生效流量包办理
103:查询本月消费明细
104:缴费记录查询
105:查询账户积分
108:查询套餐使用量
112:3G流量卡查询
1131:查询上月账单情况
0000:查询本机增值业务
PL/SQL procedure successfully completed
尊敬的用户,您的话机,本月消费总额:96.91元.当前余额:16.89元.亲!请回复序号获取更多服务:
61.当月生效流量包办理
103.查询本月消费明细
104.缴费记录查询
105.查询账户积分
108.查询套餐使用量
112.3G流量卡查询
1131.查询上月账单情况
0000.查询本机增值业务
但存在的问题是,短信的种类很多,好在有字段可以大致区分出来类似的回复短信,但是即便如此,还是存在很多没有业务代码的短信,查找了很多短信记录总算是总结出来一条规律就是包含业务代码的短信总是>=3行的,当然也存在=3行但是没有回复代码的短信,由于实在是缺乏剔除的规律性因此决定在取出后再做二次剔除,于是就编写了下面这段代码,后来发现取出来的还是不准确,原来还存在代码和名称用空格的方式
2/2温馨提醒,使用短信营业厅查询业务、充值交费、积分兑换优惠业务包,方便快捷、省时省心。回代码体验:
111 银联卡交费
518 数字竞猜奖30元话费活动介绍
50321 确认100积分兑换15条短信
实际上,只需要将空格替换成小数点就解决了。 最终的代码如下:
SQL> set serveroutput on
SQL> declare n number;
2 n1 number;
3 v_id varchar2(200);
4 v_content varchar2(4000);
5 begin
6 --1.先判断回车的数量 从而确定需要循环的次数
7 select (length(replace(smscontent_ys,' ','.'))-length(replace(replace(smscontent_ys,' ','.')||chr(10),chr(10),null))) into n
/* 首先计算长度减掉将回车符替换为空的长度,从而得出存在的回车数量 */
/*replace(smscontent_ys,' ','.') 将可能为空格的替换为小数点, 因为最后一行没有空格,因此需要给短信内容添加一个回车符,这样便于一次性循环取出所有的代码 */
8 from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
9 --2.找出第一个回车前还有几个非有效的小数点
10 select length(substrreplace(smscontent_ys,' ','.')||chr(10),1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1)))-
11 length(replace(substr(replace(smscontent_ys,' ','.')||chr(10),1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1)),'.',null)) into n1
12 from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
13 for i in 1..n loop --循环之前确定的次数
14 select substr(replace(smscontent_ys,' ','.')||chr(10),instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,i),instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)-instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,i)),
15 substr(replace(smscontent_ys,' ','.')||chr(10),instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)+1,instr(replace(smscontent_ys,' ','.')||chr(10),chr(10),1,1+i)-instr(replace(smscontent_ys,' ','.')||chr(10),'.',1,n1+i)) into v_id,v_content--获取id和内容
16 from TMP_SMSRESULT_1403_108_D where sessionid='SMS201403010000060071';
17 dbms_output.put_line(v_id||':'||v_content); --将收集到的代码和内容打印出来以便查看是否有效。
18 end loop;
19 end;
20 /
61:当月生效流量包办理
103:查询本月消费明细
104:缴费记录查询
105:查询账户积分
108:查询套餐使用量
112:3G流量卡查询
1131:查询上月账单情况
0000:查询本机增值业务
PL/SQL procedure successfully completed
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12216142/viewspace-1125387/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12216142/viewspace-1125387/