#コード作成のきっかけ
CSVファイルに保存されていた電話番号を読み込み、別のシステムに送る時に事件は起きました。
CSVファイルに保存されていた電話番号は、全角ハイフンだけでなく、マイナス(−)やダッシュ(―)、エンダッシュ(–)などで区切られていたのです・・・。
送り先のシステムでは、電話番号を半角ハイフンでしか読み取る事ができず、このままではエラーが起きてしまいます。
その為、変換するプログラムを作成しました。
これは、phonenumbersを知らなかった時に作成したプログラムになります。
(phonenumbersってすごい。。。 phonenumbers Python Library)
#対象の電話番号
CSVファイルを見てみると、様々な電話番号がありました。
全角数字の電話番号、()で数字を分けた電話番号、スペース(空白)で分けた電話番号、国際電話表現になっている電話番号、幸いなことに数字のみの電話番号はありませんでした。
今回は数字だけの電話番号をハイフンで分ける事はできないプログラムになります。
(03とか0120とか、数値によってハイフンの位置を決める必要があります。この規則性をコーディングするのは面倒なので、そのような場合はphonenumbers使うと便利です。)
print(number_format('0120-123-123')) #半角
print(number_format('0120ー999ー999')) #全角
print(number_format('03(1111)2222')) #()付き 全半角
print(number_format('090 1111 2222')) #空白区切り 全半角
print(number_format('080ー1111−2222')) #全角のハイフンとマイナス記号 全半角
print(number_format('+81-90-1234ー5678')) #国際電話での表現 全半角
#半角ハイフンの電話番号に変換する
半角ハイフンの電話番号に変換する為に、まずは全角の数字を半角に変化します。
また、電話番号を一度数字の固まりごとに分割し、分割した数字を半角のハイフンで連結する事にしました。(電話番号内のマイナスやダッシュを検索し、半角ハイフンにする事も考えましたが、全てのハイフンっぽいものを洗い出すのではなく、今回は記号の部分を半角ハイフンに変換する方向性で進めました)
国際電話の場合は、+81を取り出して、0を先頭につける事にします。
これらの処理をPythonでコーディングしたものが、以下になります。
import re
def number_format(call_number):
format_number = ''
hyphen = '-'
hankaku = str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}) #全角を半角に
split_number = re.findall(r'\d+', call_number) #数字のみ取り出す
if call_number[:1] == '+' or call_number[:1] == '+': #+81の国際電話番号の場合
del split_number[0]
format_number = '0' + split_number[0]
else:
format_number = split_number[0]
for i in range(1, len(split_number)): #分割した数字を繋げる
format_number += hyphen + split_number[i]
return format_number.translate(hankaku)
#結果
結果としては、以下のように半角数字、半角ハイフンの電話番号に置換する事ができました。
0120-123-123
0120-999-999
03-1111-2222
090-1111-2222
080-1111-2222
090-1234-5678
今回は、数字だけの電話番号を半角ハイフンのフォーマットに変換する事はできていませんが、半角ハイフンに似ている記号を使用した電話番号を半角ハイフンの電話番号に変換する事はできました。