1

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

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

4

2 回答 2

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.
于 2012-09-13T17:37:41.257 回答
1

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

于 2012-09-13T17:31:18.177 回答