2012-09-13 63 views
1

我需要对数据库中的列进行排序,此列是我的类别结构,列中的数据是城市名称,但并非所有城市的名称都相同,我需要什么要做的是通过列中的值我可能有20-40值是同一城市,但写作不同我需要一个脚本,可以解释它们,并将其更改为单个值组织在mysql中更改字段值

所以我可能有两个值在城市专栏中说:(英格兰>伦敦)和(westlondon),但我需要改变为伦敦,是否有一个脚本能够解释已经存在的值,并将它们更改为值会希望我知道一个一个地做这件事的困难方式,但是想知道是否有可以完成的任何语言的脚本这个

+0

我觉得你的运气了。关于你所能做的就是使用LIKE通配符来查找'%LONDON%',但是没有办法编码能够找出映射到哪里的东西,除非你事先弄明白 – andrewsi

+0

不太确定为什么某个人低估了你,我认为这是一个很好的问题,所以我把你备份到0.有趣的是,知道是否有一个程序可以做到这一点... –

+0

我想我可能是运气不佳,这一个我到处搜索以为有人会遇到这个问题,我有超过16,000类别,不包括重复/变化 – dom

回答

2

我已经做了很多次这种数据清理工作,恐怕我不知道比编写自己的修复更容易。

我可以推荐的一件事是使过程可重复。有一个类似(rulenum,pattern,new_value)的替换表。然后,处理表格相关位的副本,以便重新运行整个脚本。然后,你可以从明显的匹配开始(看看看起来是否合理),然后转移到更晦涩的匹配上。最终你会有50个没有匹配的,你可以手动修补条目。

使其具有可重复性非常重要,因为您在前几次尝试中一定会发现错误匹配。

因此,像(语法未经):

CREATE TABLE matches (rule_num int PRIMARY KEY, pattern text, new_value text) 

CREATE TABLE cityfix AS 
SELECT id, city AS old_city, '' AS new_city, 0 AS match_num FROM locations; 

UPDATE c SET c.new_city = m.new_value, c.match_num = m.rule_num 
FROM cityfix AS c JOIN matches m ON c.old_city LIKE m.pattern 
WHERE c.match_num = 0; 

-- Review results, add new patterns to rule_num, repeat UPDATE 
-- If you need to you can drop table cityfix and repeat it. 
1

只是一个想法:16K不是那么多。首先使用Perl的DBI(即时假设您将使用Perl)来获取城市列,将其存储在散列(城市名称作为散列)中,然后找到满足您的需求(性能明智)的算法以遍历散列键,并使用String::Diff找到匹配的交集(阅读它,它绝对可以帮助你),并将其作为值存储..然后你可以使用它来更新数据库使用键(旧值)和值作为新的价值更新。