(我正在使用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。
有人可以解释一下我可以做什么来格式化数据吗?我可以手动完成,但这需要很长时间!
答案 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的软件开发人员,并为这两项服务提供了帮助。