导读:数据改写与数据迁移面临重大挑战--但也收获巨大。
在过去十年,我经常需要面对无数次的数据改写任务,无论是从旧有的数据库迁移到新的数据库,还是利用新的程序工具发掘大量数据系列,又或者是其他的大量任务,以某种形式得到数据并以新的方式转存为数据,这样的事情每时每刻都会频繁发生。对包括IT人在内的大多数人,数据改写和迁移都只是个虚幻的魔法。
让我们花几分钟的时间来解释下整个过程是怎么运作的。大家可能会发现,引用这些有助于向那些不太懂技术的人沟通讲解比较微妙的后端技术流程。
一切先从Excel开始
我们选择一个不太幸运的常见情形:可怕的Excel电子表格。一段时间以前,有一家很遥远的公司,他们确定需要收集涉及到商业流程的数据--库存、销售、客户等企业拥有的所有数据。由于缺乏合适的工具,有个人利用Excel电子表格完成了这项工作。随着时间的流逝,数以千计的记录大量积聚,Excel表格变得越来越没有用处,最终该公司决定将所有数据转到真正的数据库中,他们聘请了咨询团队,定义了内部资源,***派一个人接手了该任务。
首先要做的就是检查数据本身的干净度。在一个***的世界,电子表格有点类似于数据库,每一列都有公共区块--如名字、姓氏、街道、城市等等。然而,运作的方法并不总是这样,布局有可能自上而下,信息包含在同一列下单独的行中,如联系列下有全称、公司、地址、手机号码等单独的行。下一列则有可能是2012年***的订单或销售或其他数据,这带来了一个更具挑战性的问题。
让我们看看***种情况,这种最为简单。数据相对清晰,结构明显,可以方便地外移到CSV上,通过自定义的解析器将其转化为一个数据库。好的CSV解析器可以将所有记录拉到一个数组中,数组可以剥离不同的数据记录,并嵌入到新的数据库中。完成这些流程后,我们能检查数据,也能修改数据,以更好地适应新数据库的格式。
举例来说,我们可能会在一个电话号码字段中运行正则表达式,将各种各样的手机号码格式转换成一种标准格式,这需要折腾所有的特殊字符,重新设定结果串,然后才能将数据嵌入到新的数据库。这种才做会将数字如(212)555-1212、212-555-1212、2125551212、212 555 1212、212.555.1212等转换为类似(212)555-1212的标准格式,有助于可读性和搜索。
我们可能用类似/[^0-9]+/的正则表达式卸除这些内容,然后用如/([0-9]{3})([0-9]{3})([0-9]{4})/这样的正则表达式再将它们重新组合,***匹配结果是212、555和1212。我们现在可以我们喜欢的任何格式来重新设定手机号码,如果我们碰到一个数字,因为数位过多或过少而不能成为手机号码数字时,我们也能摆脱困境。
形式自由一切都自由
当我们进入到更自由的表单字段后,情况变得更为不确定。确定地址特别麻烦,因为设定地址格式有各种各样不同的方法。我们也需要面对大量的街道和城市名,需要确定我们是否正确地掌握了“Washington, DC” 、“Washington/DC” 、“Washington DC”,以及一些类似“Winston-Salem DC”、“King of Prussia, PA”、“Scranton, Penn” “N. Providence RI”、 “Houston, TX”和“O’Fallon, IL”等古怪的地名。
这些各种各样的变化能让解析器犯错,因为我们不能消除某些特殊的字符。此外,我们不能指望一个城市的数据量能跟一个州,或州内现存和拥有的缩写的数据量相比。因此,我们需要构造条件表达式,凝成一股劲来尽***努力确定实际的城市和州,甚至需要对美国的每一个城市和每一个州的数据库进行核对。根据结果,我们仍然需要在该记录上摆脱困境,如果没法做出确定的决断,至少提出一个需要手动检查的问题的记录。
我们现在才仅仅开始发现事情的表象,还有大量的工作,就是搞清楚每一个记录中的城市、州、手机号码等,根据内容,我们需要冲洗并重复电子表格中的每一个其他字段。
这种混乱的直接结果是,不受约束的自由形式的数据项,无时无刻无论何地都困扰着每家公司,而且它不一定是Excel形式。数据项可以是Access,一个自主开发的数据库,或者其他任何应用程序。除非能检查输入的数据的有效性和格式,否则这些数据很可能只是一个烂摊子。当然,问题的关键是建立一个合适的数据库前端来处理数据的输入:我们可以清理修饰数据进入的方式,这样能持续提高数据的准确性和可用性,这是摆在首位的使用数据库的好处之一。
但是,我们不能忽视在后端处理这种类型的数据集所付出的努力,现在也已经开发了各种工具来简化流程,但他们并不能适用于所有情况。虽然他们可能对输入数据的某部分起作用,不能起作用的部分可能导致使用那些工具更加困难重重。
这种性质的工作十分乏味,尤其注重细节,要求大量的手工数据检验、试运行、调试,同时需要在该项目上工作的部分的开发者具备前瞻性思维。当上面说到的所有东西都实现了,结果肯定是:我们的付出是值得的。
使用干净的数据,一切都变得很简单,只要别低估清理数据的旅途中可能面临的巨大挑战就行。