kettle引用外部脚本完成电话号码清洗、去重缩进

9 篇文章 1 订阅

项目需要对电话是否真实进行判断,并去除重复项。

今天在项目当中引用java 脚本进行数据清洗时,创建 List<String>  之后程序就各种报错。

求大神指教~~~

于是参考了张小凡vipkettle案例四使用java脚本进行数据处理,解决了遇到的问题。

1、电话清洗

电话分为两种:座机、手机

清洗规则如下:

正则匹配出其中全部的数字;删除首位非0数字前的全部0;针对剩余数字进行判断:

少于8位电话:删除;
8位电话:5,6,8开头保留,否则无效座机删除;
9位电话:1开头:若接5,6,8,错误的本地座机,保留后8位;若第2位不是5,6,8,错误的手机号,删除。非1开头:前面加0,异常的座机号;
10位电话:1位为1:2位为0或1:(3位为5,6,8,错误的本地座机,保留后8位;3位非5,6,8,错误手机号);2位非0或1:错误手机号,删除。1位非1,座机号,前面加0;
11位电话:1位为1:若2:3位为00,10,11,01,且4位5,6,8,那么本地座机,保留后8位;否则为手机号。1位非1,外地座机,前面添加0;
11位以上电话:1位为1:错误的手机号;1位非1,外地座机,前面添加0;

核心java代码如下:

//去重缩进需要用到的函数
package cyt.com.dudu.cyt;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class phoneClean {
	    //验证手机号码函数
		public static final  String CleaningPhone (String sPhone){		
	    	
	    	String regEx = "[^0-9]";//匹配指定范围内的数字
	    	try {
	    		//取出空格及- 对座机进行整理
	    		//1、判断是否为空
	    		if(sPhone.indexOf("空")!=-1){
	    			return "空";
	    		}else {
	    			
	    			//利用正则去除除数字外的杂志
	    			 //Pattern是一个正则表达式经编译后的表现模式
	    	        Pattern p = Pattern.compile(regEx);
	    	        // 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。
	    	        Matcher m = p.matcher(sPhone);
	    	        String string = m.replaceAll(" ").trim();
	    			//取出前面的零
	    			String sPhone1 = string.replaceAll("\\s*", "");
	    			System.out.println(sPhone1);
	    			for(int b=0; b<sPhone1.length();b++){
	    				System.out.println(b);
	        			if(sPhone1.substring(0, b+1).equals("0")){
	        				sPhone1 = sPhone1.substring(1);
	        				System.out.println(sPhone1);
	        			}else {
	        				System.out.println("首位非0.跳出");
	        				break ;
	        			}
	    			}
	    			
	    			//判断前两位是否是86
	    			if(sPhone1.substring(0, 2).equals("86")){
	    				sPhone1 = sPhone1.substring(2);
	    				System.out.println(sPhone1);
	    			}else {
	    				//前两位非86,判断其手机号长度
	    				int phonenum = sPhone1.length();
	    				System.out.println("手机号长度:" + phonenum );
	    				if(phonenum<8){
	    					sPhone1 = "空" ;
	    				}else if(phonenum==8){
	    					if(sPhone1.substring(0, 1).equals("5") ||sPhone1.substring(0, 1).equals("6") ||sPhone1.substring(0, 1).equals("8") ){
	    						
	    					}else{
	    						sPhone1 = "空" ;
	    					}
	    				}else if(phonenum==9){
	    					if(sPhone1.substring(0, 1).equals("1")  ){
	    						if(sPhone1.substring(1, 2).equals("5") ||sPhone1.substring(1, 2).equals("6") ||sPhone1.substring(1, 2).equals("8")){
	    							sPhone1 = sPhone1.substring(1);
	        						System.out.println("1开头的9位手机号,删除1保留后八位:"+sPhone1);
	    						}else{
	    							sPhone1 = "空" ;
	    						}
	    						
	    					}else{
	    						sPhone1 = "空" ;
	    					}
	    				}else if(phonenum==10){
	    					if(sPhone1.substring(0, 1).equals("1")  ){
	    						if(sPhone1.substring(1, 2).equals("0") ||sPhone1.substring(1, 2).equals("1") ){
	    							if(sPhone1.substring(2, 3).equals("5") ||sPhone1.substring(2, 3).equals("6") ||sPhone1.substring(2, 3).equals("8")){
	        							sPhone1 = sPhone1.substring(2);
	            						System.out.println("1开头,2位0或1,3位5、6、8的10位手机号,保留后八位:"+sPhone1);
	        						}else{
	        							sPhone1 = "空" ;
	        						}
	    							
	    						}else{
	    							sPhone1 = "空" ;
	    						}
	    						
	    					}else{
	    						sPhone1 = "0" + sPhone1 ;
	    					}
	    				}else if(phonenum==11){
	    					if(sPhone1.substring(0, 1).equals("1")  ){
	    						if(sPhone1.substring(1, 2).equals("0") ||sPhone1.substring(1, 2).equals("1") ){
	    							if(sPhone1.substring(2, 3).equals("0") ||sPhone1.substring(2, 3).equals("1") ){
	    								
	    								if(sPhone1.substring(3, 4).equals("5") ||sPhone1.substring(3, 4).equals("6") ||sPhone1.substring(3, 4).equals("8"))
	        							sPhone1 = sPhone1.substring(3);
	            						System.out.println("1开头,2、3位0或1,4位5、6、8的11位座机号,保留后八位:"+sPhone1);
	        						}else{
	        							sPhone1 = "空" ;
	        						}
	    							sPhone1 = sPhone1.substring(1);
	        						System.out.println("1开头的9位手机号,删除1保留后八位:"+sPhone1);
	    						}else{
	    							
	    							System.out.println("十一位手机号:"+ sPhone1 );
	    						}
	    						
	    					}else{
	    						sPhone1 = "0" + sPhone1 ;
	    					}
	    				}else if(phonenum>11){
	    					if(sPhone1.substring(0, 1).equals("1")  ){
	    						sPhone1 = "空" ;
	        						
	    					}else{
	    						sPhone1 = "0" + sPhone1 ;
	    						System.out.println(sPhone1);
	    					}
	    				}
	    				
	    				
	    			}
	    			
	    			//整理完成后的电话号码
	    			System.out.println("整理完成后的电话号码:" + sPhone1 );
	    			return sPhone1;
	    			}
	    		
			} catch (Exception e) {
				return "空";
			}
		}
		
	
}

 

2、电话去重

本想使用数组进行去重,返回一个 list 数组。奈何 kettle 报了关于数组奇怪的错,所以采用 StringBuffer 完成拼接

public static final String toReenter(String phone1,String phone2,String phone3,String phone4,String phone5 ){
			 	
			List<String> phoneListTest = new ArrayList<>();
		        phoneListTest.add(phone1);
		        phoneListTest.add(phone2);
		        phoneListTest.add(phone3);
		        phoneListTest.add(phone4);
		        phoneListTest.add(phone5);
		        StringBuffer phoneList = new StringBuffer();
		        for(int b=0;b<5;b++){
		        	if(b==0){
		        		phoneList.append(phoneListTest.get(b).toString());
		        		phoneList.append(",");
		        	}else {
		        		if(phoneList.indexOf(phoneListTest.get(b).toString())!=-1){
		        			
		        		}else {
		        			phoneList.append(phoneListTest.get(b).toString());
			        		phoneList.append(",");
		        		}
		        	}
		        }
		        
		        return phoneList.toString() ;
		}

3、kettle 实现

 kettle 需要对字段是否为空进行判断,以前出过关于字段为空的各种问题,所以此次直接对含有空值的字段进行判断,赋值。

核心的功能已经上传到我的博客当中,可以自己去找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值