Normalize Phone
normalize_phone · validity · text, number
2026-09-23
กำลังประมวลผล…
normalize_phone · validity · text, number
2026-09-23
เบอร์เดียวกันถูกกรอกได้สิบแบบ ทั้ง 081-234-5678, 0812345678, +66 81 234 5678 และ 66812345678 การนับลูกค้าหรือจับคู่ข้อมูลจึงเพี้ยน เทคนิคนี้แปลงทุกแบบให้เป็นรูปแบบเดียวตามประเทศที่เลือก และทำเครื่องหมายค่าที่ไม่เข้าเกณฑ์ไว้แทนการทิ้ง
split_column ก่อนdefaultRegion เดียวเท่านั้น-, วงเล็บ และช่องว่างออก ถ้าพบตัวอักษรอื่นจะถือว่าไม่ผ่าน+ หรือ 00 จะตัดรหัสประเทศออกและต้องตรงกับประเทศที่เลือก0 ของไทย จะตัดออกเพื่อให้เหลือเลขหมายจริง0output — e164 ได้ +66812345678, national ได้ 0812345678, digits_only ได้ 812345678| Parameter | Type | Default |
|---|---|---|
column | string | — |
action | flag | null | remove_row | "flag" |
newColumnName | string | — |
defaultRegion | TH | US | GB | SG | MY | JP | VN | "TH" |
output | e164 | national | digits_only | "e164" |
import json
import re
REGIONS = {'TH': {'dial': '66', 'trunk': '0', 'min': 8, 'max': 9},
'US': {'dial': '1', 'trunk': '', 'min': 10, 'max': 10}}
def normalize_phone(value, region='TH', output='e164'):
if value is None:
return {'value': None, 'valid': None}
rules = REGIONS[region]
raw = str(value).strip()
if re.search(r'[^\d+\-().\s ]', raw):
return {'value': value, 'valid': False}
digits = re.sub(r'\D', '', raw)
if digits == '':
return {'value': value, 'valid': False}
if raw.startswith('+') or digits.startswith('00'):
digits = re.sub(r'^00', '', digits)
if not digits.startswith(rules['dial']):
return {'value': value, 'valid': False}
digits = digits[len(rules['dial']):]
elif rules['trunk'] and digits.startswith(rules['trunk']):
digits = digits[len(rules['trunk']):]
elif digits.startswith(rules['dial']) and len(digits) > rules['max']:
digits = digits[len(rules['dial']):]
if not rules['min'] <= len(digits) <= rules['max']:
return {'value': value, 'valid': False}
if output == 'e164':
return {'value': '+' + rules['dial'] + digits, 'valid': True}
if output == 'national':
return {'value': rules['trunk'] + digits, 'valid': True}
return {'value': digits, 'valid': True}
values = ['081-234-5678', '+66 81 234 5678', '(02) 123 4567', '12345', None]
print(json.dumps([normalize_phone(v) for v in values], ensure_ascii=False))
คอลัมน์ phone มีทั้งเบอร์มือถือและเบอร์บ้านที่พิมพ์คนละแบบ เลือก defaultRegion เป็น TH และ output เป็น e164 แล้วดูคอลัมน์ผลตรวจว่ามีกี่ค่าที่ไม่ผ่าน ค่าที่ไม่ผ่านมักเป็นเบอร์ที่ขาดหลักหรือมีข้อความปน ให้แก้ที่ต้นทางหรือกรองออกด้วย filter_rows ก่อนส่งเข้าระบบ SMS
ใช้ pad_or_strip_zeros เมื่อเลขศูนย์นำหน้าหายไปตั้งแต่ไฟล์ต้นทาง ใช้ validate_regex สำหรับกฎเฉพาะที่ต่างจากมาตรฐาน และใช้ mask_pii ก่อนแบ่งปันไฟล์