Chào các anh chị em trong diễn đàn,
Dạo này mình có làm việc nhiều với dữ liệu đầu vào từ nhiều nguồn khác nhau, và gặp không ít rắc rối với các chuỗi ký tự lộn xộn, chứa cả chữ, số, ký tự đặc biệt. Xử lý thủ công thì mất thời gian mà dùng các hàm Excel đôi khi lại không đủ linh hoạt.
Tình cờ mình thử áp dụng Python trong Excel để giải quyết vấn đề này và thấy khá hiệu quả. Nay chia sẻ lại cách mình làm, hy vọng giúp ích được cho mọi người.
Tình huống cụ thể:
Mình có một cột dữ liệu chứa các mã sản phẩm theo định dạng như sau:
SP-ABC-123-XYZDEF_456_GHI789-JKLMNO PQR 101
Yêu cầu là trích xuất phần mã chính (ví dụ: ABC, DEF, JKL, MNO PQR) và loại bỏ các ký tự phân tách như -, _, khoảng trắng.
Cách giải quyết bằng Python trong Excel:
Mình dùng hàm =PY(A1) để gọi script Python cho từng ô. Script của mình như sau:
import pandas as pd
import re
def extract_main_code(text):
# Loại bỏ các ký tự đặc biệt và khoảng trắng không cần thiết
cleaned_text = re.sub(r'[-_\s]+', ' ', text).strip()
# Tìm phần mã chính (giả sử nó là phần chữ hoặc chữ-số xen kẽ)
# Cách này có thể cần điều chỉnh tùy theo định dạng thực tế của bạn
match = re.search(r'([A-Za-z]+(?:\s[A-Za-z]+)*|\w+)', cleaned_text)
if match:
return match.group(1)
return cleaned_text # Trả về chuỗi đã làm sạch nếu không tìm thấy mẫu cụ thể
df = pd.DataFrame(x)
df['Cleaned_Code'] = df.iloc[:, 0].apply(extract_main_code)
return df[['Cleaned_Code']]
Giải thích ngắn gọn:
- Script nhận dữ liệu đầu vào là một DataFrame (mình truyền vào ô A1, nên
xsẽ là DataFrame chứa giá trị của A1). - Sử dụng thư viện
re(regular expression) để làm sạch chuỗi: thay thế các dấu gạch ngang, gạch dưới, khoảng trắng liên tiếp bằng một khoảng trắng duy nhất và loại bỏ khoảng trắng thừa ở đầu/cuối. - Tiếp theo, mình dùng
re.searchđể cố gắng tìm ra phần mã chính. Phần patternr'([A-Za-z]+(?:\s[A-Za-z]+)*|\w+)'này mình tự chỉnh sửa dựa trên dữ liệu mẫu, nó sẽ ưu tiên lấy các từ có khoảng trắng hoặc các ký tự chữ/số thông thường. Các bạn có thể cần thay đổi pattern này cho phù hợp với dữ liệu của mình nhé. - Kết quả trả về là một DataFrame mới chỉ chứa cột mã đã được xử lý.
Cách này khá linh hoạt, mình có thể tùy chỉnh biểu thức chính quy (regex) để xử lý nhiều trường hợp phức tạp khác nhau. Nếu ai có cách hay hơn hoặc gặp vấn đề với regex, cùng thảo luận nhé!