中英文字符的映射(TRANSLATE函数的运用)
又有很長時間沒有更新博客了=。=
這次想簡單介紹一下最近的數(shù)據清洗的工作中的發(fā)現(xiàn)的一些小方法,因為在網上搜了一下,并沒發(fā)現(xiàn)有人總結過。
背景
最近處理的數(shù)據是多個不同部門的人工錄入的數(shù)據,莫名其妙的問題非常多。
其中一個就是中英文符號的問題,我發(fā)現(xiàn)大部分的中英文符號存在以下關系(代碼是Python代碼)
65281 ! => 33 !
65282 " => 34 "
65283 # => 35 #
65284 $ => 36 $
65285 % => 37 %
…省略…
65368 x => 120 x
65369 y => 121 y
65370 z => 122 z
65371 { => 123 {
65372 | => 124 |
65373 } => 125 }
65374 ~ => 126 ~
65375 ⦅ => 127
65376 ⦆ => 128 €
65377 。 => 129 ?
65378 「 => 130 ?
65379 」 => 131 ?
65380 、 => 132 ?
有幾個字符還顯示不出來=。=
需要注意的是,最后幾行例子并不是對應的。但是句號和頓號我感覺還是列出來比較好。
以前我都是使用的replace來做,現(xiàn)在看來非常的扯淡,代碼完全沒有任何美感了。
Python中的解決方法
因為涉及到的符號比較多,在我這邊舉例就就說一下有關函數(shù)了。
具體要轉變哪些符號,大家根據自己的需求來吧。
ps:我剛學Python的時候,根本沒有多去關注translate函數(shù),感覺用法很蠢,如今真香!
ps:值得一提的是,我看了好久其他大佬的案例,才發(fā)現(xiàn)代碼里的這個str.maketrans中的str就是Python里的基礎類str。
我總以為是其他庫(例如string庫)被重命名為str了。
Oracle中的解決方法
CREATE OR REPLACE FUNCTION STANDARDIZE_STR(TEXT0 IN VARCHAR2) RETURN VARCHAR2 ASres VARCHAR2; BEGINres := TEXT0;res := TRANSLATE(res, 'Dyson!@#$%', 'Dyson'); --見代碼后的“注”res := TRANSLATE(res, '123', 'abc'); RETURN res; END;由于涉及的符號替換可能會比較多,所以我就寫在了ORACLE函數(shù)中,再到SQL查詢里調用。
由于我原來的代碼我暫時沒法復制出來(安全管理嚴格),所以我這部分代碼沒有運行過,敲錯的話還請見諒。
注:
此處有點微妙,在Oralce中,是可以用TRANSLATE函數(shù)來刪除特定的一些字符的。但是用法有點奇怪,不知道是不是我沒有get到正確方式。
理論上,當TRANSLATE的第二個參數(shù)的長度應該與第三個參數(shù)的長度一樣的,這樣才能一一對應。但是在Oracle中,第二個參數(shù)的長度是允許大于第三個參數(shù)的長度的,多出來的部分,視為需要刪除的部分=。=
所以我這行代碼的意思,其實是為了刪除“!@#$%”這些符號。
MySQL中的解決方法
#創(chuàng)建前刪除已經創(chuàng)建的自定義函數(shù) DROP FUNCTION IF EXISTS translate_str; #創(chuàng)建函數(shù) DELIMITER $$ CREATE FUNCTION `translate_str`(str0 LONGTEXT,from_str VARCHAR(1000),to_str VARCHAR(1000)) RETURNS LONGTEXTDETERMINISTIC BEGIN DECLARE i0 INT;DECLARE f_str VARCHAR(1000);DECLARE t_str VARCHAR(1000);# 本函數(shù)是在仿制oracle的translate函數(shù)# 具體函數(shù)用法參考https://blog.csdn.net/weixin_39461443/article/details/102684234# 若from_str沒有to_str長,那么to_str超長的部分將會被忽略# 若from_str比to_str長,那么from_str超長的部分將視為需要被刪除的字符SET i0 = 1;# 循環(huán)查找以替換所有的目標字符串WHILE i0 <= CHAR_LENGTH(from_str) DOSET f_str = SUBSTR(from_str, i0, 1);SET t_str = SUBSTR(to_str, i0, 1);# 若存在from_str更長的情況,超長部分將被替換為空字符串IF t_str IS NULL THENSET t_str = '';END IF;# 替換對應的字符串IF INSTR(str0, f_str) > 0 THENSET str0 = REPLACE(str0, f_str, t_str);END IF; -- SET i0 = i0 + 1;END WHILE; RETURN str0; END$$ DELIMITER ;總結
以上是生活随笔為你收集整理的中英文字符的映射(TRANSLATE函数的运用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【马三北漂记】之终章
- 下一篇: UEFI Protocol使用