这两天看了一个FME的直播课程,非常不错,适合入门者学习! 在直播结束后,举办方留了一个作业,要求非常的精简! 要求:请制作一个模板,判断相同标识码的要素,其顺序码是否存在漏编和重复。 这么简练的要求,科科还让我猜,你说,我猜不猜?
爱因斯坦曾经说过:假如只给我一个小时的时间拯救世界,我会先花55分钟去发现问题,然后再用余下的5分钟解决问题。 我没有去拯救地球,也没花那么长时间去发现并分析问题。在一看到题目就着手做了起来。由于做过地址码跳号的检查功能,在没有充分了解题目的情况下就写了模板,也是吃了先入为主的亏! 后来仔细看了下题目,再结合群里的聊天,才发现好像有点不对劲!这才有了下面的对问题的逐步分析与解决!
从数据说明中,我们可以了解到,CODE字段-前面的部分由标识码和顺序号组成。
这里有坑,审题不清就掉进去了! 我就掉在坑里了
这里有两个点:
这个可以理解为: a.找出漏编的区间,也可以将漏编的输出; 也可以理解为: b.找到漏编顺序号;
这个比较简单,找到标识码一样且顺序号也一样的要素。
从这里,可以了解到,主办方建议的转换器是AttributeCreator。而我的第一反应是:找重复可以使用Matcher或者DuplicateFilter。但经过思考与对数据的观察,发现了重复也可以使用AttributeCreator来进行查找。 经过以上的观察与分析,就可以开始进行模板的编写了!
首先来个模板整体截图
主要是可以分为两个部分: 1、提取出标识码与顺序号; 2、查找顺序号是否存在重复或者跳号; 2+、输出中间缺失的部分,这个作业中没说一定要输出来,属于画蛇添足,所以我把这一步写成了2+。
提取信息有很多种方式,FME是个很灵活的平台,我来通过提取信息展示一下, 方式一:通过StringSearcher转换器
通过这种方式,可以一次取出多个信息并赋值到相应字段,在上图的设置中是取出了标识码与顺序号。 方式二:通过AttributeSplitter转换器
在这个案例中,同样可以一次取出多个信息并赋值到相应字段。
优点:灵活应对多种复杂场景; 缺点:对使用者要求稍高了点。
优点:使用简单,易于掌握; 缺点:难以满足复杂的场景。
我理解的查重与查漏编,都可以通过判断要素间的先后关系得出,通过分析要素与它前面要素的关系,可以很方便的找出漏编与重复项,而这些都要建立在要素已经正确排序的基础上。所以我加了一个Sorter转换器。
不管是查重还是查跳号,都需要启用AttributeCreator转换器的临近要素功能,启用方式如下图所示:
然后就是选择条件赋值
接下来进行查重与查跳号
以BSM分组,如果组内要素与前一个要素的SXH值相等,则认为是重复的,将属性值设置为:重复;
依然以BSM分组,如果组内要素与前一个要素的SXH差值等于1,则认为是正常的,将属性值设置为:正常;
仍然以BSM分组,如果组内要素与前一个要素的SXH差值大于1,则认为存在跳号,将属性值设置为: 跳号区间:+前一个要素的SXH+至+当前要素的SXH;
通过对数据进行分析与观察,发现除了以上各种情况,其它的都是该分组编码开始的地方,将属性值设置为:START!
可以看到,正常、跳号与START都查出来了,由于不存在重复,所以输出的数据TH字段中没有重复信息。 如果将数据复制一份,就能看到查出了很多重复项。
在实际的数据处理中,去掉重复,剩下的就是唯一的!
这里我使用了Python来进行输出漏编的部分。与FME自带的循环或者克隆等实现方式相比,Python的这种实现方式最为简洁。下图是输出的部分数据,可以看到,漏编的顺序号都被补上了。
设置方式:
代码:
import fme
import re
import fmeobjects
class FeatureProcessor(object):
def __init__(self):
self.ptn = re.compile(u'(\d+)至(\d+)')
def input(self,feature):
ff = feature.getAttribute('TH')
rlt = self.ptn.search(ff)
if rlt:
s,e= int(rlt.group(1))+1, int(rlt.group(2))+1
for i in range(s,e):
feature.setAttribute('SXH','%04d'%(i))
self.pyoutput(feature)
else:
self.pyoutput(feature)
def close(self):
pass
首先,题目出的好,很好,非常好! 解决问题就是这样,先别着急动手,先把问题搞清楚了再行动,不然的话,越着急越耽误功夫! 在观看直播课程的时候,有很多一起学习的朋友说跟不上节奏。我觉得这很正常,没有基础的朋友学起来是有些吃力,要学会FME没那么简单! 学习这个事情本就不是一蹴而就的,只有坚持下去,才能有所收获! 关于新编顺序号,可以参考FME小案例分享-编顺序号或者FME小案例分享-编顺序号之二推送! 最后要感谢安图FME团队与数据派联合筹办的这次直播课程。非常好!干货多多! 没来得及看直播的,可以看下这个录播:https://ke.qq.com/course/574540?taid=5158698104702028&tuin=761fe5f7