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

今天在项目当中引用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引用外部脚本完成电话号码清洗、去重缩进相关推荐

  1. 通过js引用外部脚本(方便直接在浏览器上调试抓取代码)

    最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...

  2. 通过js引用外部脚本(嘿嘿,方便直接在浏览器上调试抓取代码)

    最近折腾爬虫,后端使用jQuery进行数据采集,一般都是先从浏览器中将采集代码调试好后直接放到后端跑了. 有些网址没有引用jQuery,那调试起来就不方便了,可以用以下代码动态添加script标签,将 ...

  3. QTP引用外部脚本路径的设定(二)left函数的使用

    http://blog.sina.com.cn/s/blog_5007d1b10100lxl4.html 本文转自hblxp32151CTO博客,原文链接:http://blog.51cto.com/ ...

  4. 面试小记---外部脚本必须包含 script 标签吗?

    外部脚本必须包含 <script> 标签吗? 答案是否定的. 身为小白的我一开始也是以为这句话的对了,因为本来嘛,引用外部脚本不都用的是<script>标签中的src属性吗.所 ...

  5. 动态引用外部的Javascript脚本文件

    你可以参考下面方法,进行动态为网页引用外部的Javascript脚本文件.代码写在Page_Init方法内. VB.NET: 下图是运行时,查看HTML的源代码: C#:

  6. 如何使用Gradle外部脚本进行项目构建

    本文新建一个文件other.gradle, 内容如下: println "configuring $project" task hello {doLast{println 'hel ...

  7. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...

    实验1:配置通过静态工厂方法创建的bean  [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory {private sta ...

  8. python中字符串怎么引用_Python:字符串中引用外部变量的3种方法

    方法一: username=input('username:') age=input('age:') job=input('job:') salary=input('salary') info1='' ...

  9. Angular7中引用外部JS文件

    Angular7中引用外部JS文件,步骤如下: 1. 将引入的js文件放到项目的src/assets下 2. 在angular.json文件中找到scripts项并配置js文件的相对路径 3. 在sr ...

最新文章

  1. pandas索引复合索引dataframe数据、索引dataframe中指定行和指定列交叉格子的数据内容(getting a specific value)、使用元组tuple表达复合索引的指定行
  2. Spring Boot 应用程序启动流程分析
  3. (转)python 搭建libsvm方法。python版本和libsvm版本匹配很重要!
  4. Floyed-Warshall算法(求任意两点间最短距离)
  5. Hadoop生态圈-Azkaban实现文件上传到hdfs并执行MR数据清洗
  6. Excel分压电阻计算
  7. QGIS入门级介绍——一个开源地理信息系统
  8. 2018-1-27工作周总结
  9. ElasticSearch-索引生命周期(ILM)-日期分割索引
  10. 电脑连打印机不打印,是怎么回事?
  11. flutter Icon一览表,使用字符映射表查看所有图标并使用
  12. Flickr公布2016最受欢迎照片
  13. php获取实时带宽,Golang 获取网卡时时带宽,可用于测速
  14. 用EasyGBD做国标GB28181协议级联
  15. 如何保证云docker容器重启后数据不丢失
  16. Maven | 05.Maven项目结构及Maven命令
  17. 【GDSOI2017】魔兽争霸 x
  18. Ansible安装与配置
  19. 关于大数据测试,你一定要试试python的fake库
  20. angular中service、provice、factor区别

热门文章

  1. linux磁盘满了以及负载过高解决办法
  2. 请不要拿ipad和手机、上网本相提并论
  3. 【JAVA秘籍功法篇-SpringBoot】SpringBoot如何集成Redis?
  4. 金属质感不锈钢按钮Button
  5. Python字母数字下划线生成田字格随机密码
  6. 判断是否为节假日和一天是否为周末
  7. HTML制作彩带,用彩带制作漂亮心形风铃方法教程
  8. 中国降解母粒行业研究与投资预测报告(2022版)
  9. 电磁场复习之场论总结
  10. R语言实战笔记--第九章 方差分析