日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

中英文字符的映射(TRANSLATE函数的运用)

發布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 中英文字符的映射(TRANSLATE函数的运用) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

又有很長時間沒有更新博客了=。=
這次想簡單介紹一下最近的數據清洗的工作中的發現的一些小方法,因為在網上搜了一下,并沒發現有人總結過。

背景

最近處理的數據是多個不同部門的人工錄入的數據,莫名其妙的問題非常多。
其中一個就是中英文符號的問題,我發現大部分的中英文符號存在以下關系(代碼是Python代碼)

for i in range(65281, 65381):print(i, chr(i), '=>', i-65248, chr(i-65248))

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來做,現在看來非常的扯淡,代碼完全沒有任何美感了。

Python中的解決方法

因為涉及到的符號比較多,在我這邊舉例就就說一下有關函數了。
具體要轉變哪些符號,大家根據自己的需求來吧。
ps:我剛學Python的時候,根本沒有多去關注translate函數,感覺用法很蠢,如今真香!

import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(3,2), dtype=np.str) df[0] 0 0.8857066754596298 1 0.6980269340245522 2 0.1620513328026375 Name: 0, dtype: object df[0].str.translate(str.maketrans('123', '!@#', '45')) # 替換123,刪除45

ps:值得一提的是,我看了好久其他大佬的案例,才發現代碼里的這個str.maketrans中的str就是Python里的基礎類str。
我總以為是其他庫(例如string庫)被重命名為str了。

0 0.887066796@98 1 0.6980@69#0@@@ 2 0.!6@0!##@80@6#7 Name: 0, dtype: object df[0].str.translate(str.maketrans('1235', '!@#%', '1234')) # maketrans函數中的,第三個參數中的字符會覆蓋前兩個參數 0 0.88%70667%%9698 1 0.6980690%% 2 0.60%8067% Name: 0, dtype: object

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函數中,再到SQL查詢里調用。
由于我原來的代碼我暫時沒法復制出來(安全管理嚴格),所以我這部分代碼沒有運行過,敲錯的話還請見諒。

注:
此處有點微妙,在Oralce中,是可以用TRANSLATE函數來刪除特定的一些字符的。但是用法有點奇怪,不知道是不是我沒有get到正確方式。
理論上,當TRANSLATE的第二個參數的長度應該與第三個參數的長度一樣的,這樣才能一一對應。但是在Oracle中,第二個參數的長度是允許大于第三個參數的長度的,多出來的部分,視為需要刪除的部分=。=
所以我這行代碼的意思,其實是為了刪除“!@#$%”這些符號。

MySQL中的解決方法

#創建前刪除已經創建的自定義函數 DROP FUNCTION IF EXISTS translate_str; #創建函數 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);# 本函數是在仿制oracle的translate函數# 具體函數用法參考https://blog.csdn.net/weixin_39461443/article/details/102684234# 若from_str沒有to_str長,那么to_str超長的部分將會被忽略# 若from_str比to_str長,那么from_str超長的部分將視為需要被刪除的字符SET i0 = 1;# 循環查找以替換所有的目標字符串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函数的运用)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。