2012-09-13 65 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找到匹配的交集(閱讀它,它絕對可以幫助你),並將其作爲值存儲..然後你可以使用它來更新數據庫使用鍵(舊值)和值作爲新的價值更新。