kettle引用外部脚本完成电话号码清洗、去重缩进
项目需要对电话是否真实进行判断,并去除重复项。
今天在项目当中引用java 脚本进行数据清洗时,创建 List<String> 之后程序就各种报错。
求大神指教~~~
于是参考了张小凡vip的kettle案例四使用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 ;}}//判断前两位是否是86if(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 需要对字段是否为空进行判断,以前出过关于字段为空的各种问题,所以此次直接对含有空值的字段进行判断,赋值。
核心的功能已经上传到我的博客当中,可以自己去找。
kettle引用外部脚本完成电话号码清洗、去重缩进相关推荐
- 通过js引用外部脚本(方便直接在浏览器上调试抓取代码)
最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...
- 通过js引用外部脚本(嘿嘿,方便直接在浏览器上调试抓取代码)
最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...
- QTP引用外部脚本路径的设定(二)left函数的使用
http://blog.sina.com.cn/s/blog_5007d1b10100lxl4.html 本文转自hblxp32151CTO博客,原文链接:http://blog.51cto.com/ ...
- 面试小记---外部脚本必须包含 script 标签吗?
外部脚本必须包含 <script> 标签吗? 答案是否定的. 身为小白的我一开始也是以为这句话的对了,因为本来嘛,引用外部脚本不都用的是<script>标签中的src属性吗.所 ...
- 动态引用外部的Javascript脚本文件
你可以参考下面方法,进行动态为网页引用外部的Javascript脚本文件.代码写在Page_Init方法内. VB.NET: 下图是运行时,查看HTML的源代码: C#:
- 如何使用Gradle外部脚本进行项目构建
本文新建一个文件other.gradle, 内容如下: println "configuring $project" task hello {doLast{println 'hel ...
- Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
实验1:配置通过静态工厂方法创建的bean [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory {private sta ...
- python中字符串怎么引用_Python:字符串中引用外部变量的3种方法
方法一: username=input('username:') age=input('age:') job=input('job:') salary=input('salary') info1='' ...
- Angular7中引用外部JS文件
Angular7中引用外部JS文件,步骤如下: 1. 将引入的js文件放到项目的src/assets下 2. 在angular.json文件中找到scripts项并配置js文件的相对路径 3. 在sr ...
最新文章
- pandas索引复合索引dataframe数据、索引dataframe中指定行和指定列交叉格子的数据内容(getting a specific value)、使用元组tuple表达复合索引的指定行
- Spring Boot 应用程序启动流程分析
- (转)python 搭建libsvm方法。python版本和libsvm版本匹配很重要!
- Floyed-Warshall算法(求任意两点间最短距离)
- Hadoop生态圈-Azkaban实现文件上传到hdfs并执行MR数据清洗
- Excel分压电阻计算
- QGIS入门级介绍——一个开源地理信息系统
- 2018-1-27工作周总结
- ElasticSearch-索引生命周期(ILM)-日期分割索引
- 电脑连打印机不打印,是怎么回事?
- flutter Icon一览表,使用字符映射表查看所有图标并使用
- Flickr公布2016最受欢迎照片
- php获取实时带宽,Golang 获取网卡时时带宽,可用于测速
- 用EasyGBD做国标GB28181协议级联
- 如何保证云docker容器重启后数据不丢失
- Maven | 05.Maven项目结构及Maven命令
- 【GDSOI2017】魔兽争霸 x
- Ansible安装与配置
- 关于大数据测试,你一定要试试python的fake库
- angular中service、provice、factor区别