需求
对原始数据未做任何清洗,数据-company_member表的start_time格式异常
观察
start_time是varchar类型的数据,根据长度可以大概判断他的格式是否正确,先按照长度分组看一下总共有哪些长度,各有多少条
count | length |
14 | 1 |
980 | 2 |
2240 | 3 |
1302 | 4 |
233828 | 5 |
7014 | 6 |
907088 | 7 |
255024 | 8 |
16114 | 9 |
244381451 | 10 |
14196 | 11 |
616 | 12 |
3743057 | 13 |
56 | 15 |
14 | 16 |
因为我们需要的日期是“年+月+日”的形式,诸如长度为1和2的肯定不符合要求。为了进一步了解它格式上究竟发生了那些错误,我们同样按照长度查看具体数据的表现。
进一步观察
调用脚本进行校验:
返回的值如下所示:
注意到只有红框中这三种类型的数据才能够正确校验。
清洗方法
根据上面的观察,我们可以注意到,长度小于等于8的start_time数据一定缺失了部分信息,是没有意义的,因此对于这部分数据,我们的处理规则是将其内容置换为null。
其次,对于‘二零零六年三月至二零一二年二月’这样的信息,有缺失也有多余,同样将其替换为null。识别这类数据的方法是对其中“至”这个字进行模糊匹配。
与此同时,还有一些诸如‘二零二三年一月十五日’这样的数据,信息没有缺失,但因为采取了汉语数字的表达方式,需要对其进行替换。
在一开始,我选择将“一”替换成“1”,“二”替换成“2”等等查看处理情况:
可以看到,这样处理的时候,没有将“十”替换掉,而如果我们简单的将“十”替换成“10”,结果将会变成这样:
更加奇怪了!!!
所以对于“十”要非常谨慎小心地处理,仔细研究的话,总共有以下几种情况:
- 二零二三年十月十号,这里的“十”需要原封不动替换成 “10”
- 二零二三年十二月十二号,这里的“十”需要替换成“1”
- 二零二三年八月三十号,这里的“十”需要替换成“0”
- 二零二三年一月二十二号,这里的“十”需要替换成“”,也就是空字符串
我在CSDN上查询了一些处理方法,但感觉都比较复杂,懒得仔细研究,所以我自己想了一个替换的方法,靠我自己暂时还没有找到逻辑漏洞,所以就先放上来。
具体如下:
- 针对上述第一种情况,我们精准识别 “二零二三年十月十号”、“二零二三年十月十号”中的“年十月”、“月十号”将其中的“十”替换成“10”
- 针对上述第二种情况,我们精准识别“二零二三年十二月十二号”中的“年十”、“月十”(注意这这一步处理一定要在第一步之后,这样的话所有十月、十号的数据已经被替换掉,不会造成误伤)替换成“1”
- 针对上述第三种情况,我们精准识别“二十号”“三十号”将其中的“十”替换成“0”
- 针对上述第四种情况,因为这样的只有可能是“二十X号”和“三十一号”,我们识别“二十”“三十”(注意这这一步处理一定要在第三步之后,这样的话所有“二十号”“三十号”的数据已经被替换掉,不会造成误伤)将其中的“十”替换成“"
也就是在replace条件中加上以下几项:
观察数据可知,没有什么太大的问题
然后在用脚本对他们进行校验即可