在mysql中组织更改字段值

时间:2012-09-13 14:44:47

标签: php mysql perl

我需要对数据库中的列进行排序,此列是我的类别结构,列中的数据是城市名称,但不是每个城市的所有名称都相同,我需要做的是通过列i中的值可能具有20-40个值,这些值是同一个城市但写的不同我需要一个可以解释它们并将它们更改为单个值的脚本

所以我可能在城市列中有两个值说:(英格兰>伦敦)和(westlondon)但我需要改为伦敦,是否有一个能够解释已经存在的值的脚本在那里并将它们更改为值将希望我知道一个接一个地执行此操作的困难方法,但想知道是否有任何语言的脚本可以完成此

2 个答案:

答案 0 :(得分: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 :(得分:1)

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