数据库不一致

时间:2011-01-23 17:42:22

标签: sql regex sqlite

(我正在使用SQLite3)

我的表格中包含

等字段
Name
Zipcode
State
City
State
StreetAddress

问题是,在名称字段中,人们输入格式不一致的数据

例如,

Name (single column)
====================
John Smith MD
Jason Young M.D
Charlie Horse MD.
Kim Powell PH.d
Sandy Fox Phd M.D.

我想清理MD以保存为M.D.和Phd / PH.d为博士(请记住,名称是1字段)。

街道地址也存在问题,例如单词之间的多个空格而不是1。

有人可以解释一下我可以做什么来格式化数据吗?我可以手动完成,但这需要很长时间!

6 个答案:

答案 0 :(得分:2)

您不应该简单地接受来自用户界面的数据,并立即将其保存在数据库中而不进行验证和清理。您也可以通过这种方式更安全地使用SQL注入。

我不知道您的视图和持久层之间有什么对象,但我建议在控制器或服务层添加验证和绑定层,最好是控制器。

答案 1 :(得分:2)

您可以尝试使用Google Refine(免费下载的程序)http://code.google.com/p/google-refine/非常适合各种数据清理......

答案 2 :(得分:1)

这是一系列字符串翻译。它们中的大多数都很简单,其中很多都可能不需要正则表达式。

简单算法:

1)在空格上拆分名称

2)丢弃空值,这些是两个或多个空格的结果

3)取每个值,转换为大写,删除句点,破折号或其他任何内容,然后在已知后缀的表格中查找,例如“MD”,“PHD”,并将其替换为所需的值。< / p>

4)从第3步开始,任何不匹配的内容都会按原样保留

显然这要求你建立一个已知后缀的列表,如MD等。这并不是那么糟糕。在Direct Marketing中执行此操作的大型专业软件包就是这样处理的。

5)重组结果值

格式化名称没有正确的定义,这是一个问题,你想要达到多少统一性所需的程度。

除此之外,Duffy的建议是合理的。

答案 3 :(得分:1)

对于地址,您可能希望根据您所在地区/国家/地区的特定地址数据库对其进行验证。

  

我想清理MD以保存为M.D.和Phd / PH.d为PHd(请记住名称是1字段)。

查找MD和PHD的所有变体并运行一系列更新(replace function)

update tbl set name = replace(name, 'M.D.', 'MD')
update tbl set name = replace(name, 'MD.', 'MD')
update tbl set name = replace(name, 'M.D', 'MD')
update tbl set name = replace(name, 'M.D', 'MD')
update tbl set name = replace(name, ' MD', ' MD')  -- fix case, hope no name starts with "MD"
update tbl set name = replace(name, 'PHD', 'PhD')  -- fix case
update tbl set name = replace(name, 'PH.D', 'PhD')  -- fix case
update tbl set name = replace(name, 'PH-D', 'PhD')  -- fix case
etc for any other variants you can think of or encounter
  

街道地址也存在问题,例如单词之间的多个空格而不是1

删除换行符后,将两个空格替换为一次,多次。为了更快地折叠一系列空间,我们使用8-> 1两次,然后4-> 1,然后2-> 1

update tbl set address = replace(address, '\r', ' ')
update tbl set address = replace(address, '\n', ' ')
update tbl set address = replace(address, '        ', ' ')
update tbl set address = replace(address, '        ', ' ')
update tbl set address = replace(address, '    ', ' ')
update tbl set address = replace(address, '    ', ' ')
update tbl set address = replace(address, '  ', ' ')
update tbl set address = replace(address, '  ', ' ')

答案 4 :(得分:0)

以上所有都是合理的,可能是必要的。我想补充说,最好尽可能地限制字段上的输入。例如,后缀字段应限制为使用下拉列表预先验证的值。这简化了数据输入和数据验证。

答案 5 :(得分:-1)

正则表达式和字符串操作可能适用于地址数据的有限子集,但地址行业中存在大量异常情况。 USPS是这里的权威(至少对于美国地址而言),那么为什么不使用经过USPS认证的服务?

对于地址,请尝试此批处理服务:

http://www.smartystreets.com/products/cass-certified-scrubbing

SmartyStreets还为低使用率的用户提供免费订阅的API。我是SmartyStreets的软件开发人员,并为这两项服务提供了帮助。