Giữ giá trị gốc trước khi làm sạch CSV
Giữ chuỗi nguồn, lý do từ chối và phiên bản quy tắc; so sánh ảnh hưởng của thay đổi cách phân tích số lượng bằng ví dụ Python có thể chạy.

Hãy giữ giá trị trường ban đầu trước khi làm sạch dữ liệu nhập. Số lượng đã chuẩn hóa thành 7 không cho bạn biết nguồn từng chứa 7, 007 hay một giá trị đã bị quy tắc sửa đổi. Đặt chuỗi gốc cạnh giá trị đã phân tích giúp giải thích phép biến đổi và chạy lại khi quy tắc thay đổi.
Với lập trình viên xây luồng nhập cho phân tích, đây là cách hỗ trợ tìm lỗi rất thực tế. Tổng phía sau có thể sai vì nguồn sai, bộ phân tích từ chối đầu vào hợp lệ hoặc quy tắc làm sạch đoán không đúng. Nếu quá trình nhập ghi đè đầu vào, rất khó tách ba nguyên nhân ấy.
Mỗi đầu vào cần có kết quả rõ ràng
Nguồn nhà cung cấp giả lập này lưu số lượng bằng chuỗi. Hợp đồng chấp nhận số nguyên thập phân không âm sau khi bỏ khoảng trắng hai đầu. Cho phép số không ở đầu, nhưng từ chối giá trị âm và ký tự chữ xen vào. Đây là quy tắc nghiệp vụ được chọn cho ví dụ, không phải quy tắc chung của mọi trường số lượng.
import re
def parse_quantity(raw):
token = raw.strip()
if token == "":
return None, "missing"
if re.fullmatch(r"[0-9]+", token) is None:
return None, "invalid-integer"
return int(token), None
records = []
for record_number, raw in enumerate([" 12 ", "", "1O", "007", "-3"], 1):
quantity, error = parse_quantity(raw)
records.append({
"record_number": record_number,
"raw_quantity": raw,
"quantity": quantity,
"error": error,
"rule_version": "quantity-v1",
})
for row in records:
print(row["record_number"], repr(row["raw_quantity"]),
row["quantity"], row["error"])
Bản ghi thứ nhất thành 12 và bản ghi thứ tư thành 7. Chuỗi rỗng được đánh dấu thiếu. Chữ O trong chuỗi thứ ba và dấu trừ trong chuỗi thứ năm vi phạm cú pháp được chấp nhận. Không giá trị nào bị âm thầm sửa thành một con số có vẻ hợp lý.
Biểu thức chính quy chủ ý chỉ dùng chữ số ASCII. Các nhóm ký tự số rộng hơn của Python có thể nhận ra ký tự thuộc hệ chữ khác. Dữ liệu quốc tế có thể cần hỗ trợ đó, nhưng phải là quyết định chuẩn hóa rõ ràng kèm ví dụ. Chấp nhận bất kỳ dạng nào mà bộ phân tích tình cờ hiểu được sẽ khiến tính tương thích khó giải thích.
Hình giữ chuỗi gốc cả với dòng được chấp nhận. Chuyển đổi thành công vẫn có thể làm mất thông tin mà lần kiểm tra sau cần dùng.
Phân tích tệp trước khi làm sạch trường
Hàm trên nhận chuỗi trường đã được bộ phân tích CSV tách ra. Quy tắc dấu nháy thuộc về bộ phân tích tệp; nó phải nhận biết dấu phẩy, dấu nháy bên trong và ranh giới bản ghi trước bước làm sạch số lượng. RFC 4180 mô tả quy ước trường có dấu nháy và cách biểu diễn dấu nháy kép bên trong.
Tách từng dòng văn bản theo dấu phẩy có thể làm hỏng trường trước khi bộ làm sạch nhìn thấy. Chuỗi kết quả trông như sai định dạng dù CSV gốc hoàn toàn hợp lệ. Giữ lỗi phân tích tệp riêng với lỗi giá trị nghiệp vụ để biết phải sửa ở đâu.
Định danh nguồn cũng cần chính xác. Lưu phiên bản đối tượng hoặc tệp nguồn cùng định danh bản ghi logic. Số dòng vật lý không đủ khi trường CSV có dấu nháy chứa ký tự xuống dòng. Nếu nhà cung cấp thay nội dung tệp dưới cùng tên, chỉ tên tệp không xác định được những byte nào đã tạo bảng sạch.
Vẫn phải phân biệt những giá trị bị từ chối
Đặt giới hạn độ dài trường hợp lý trước khi đổi sang số nguyên khi nhập tệp không đáng tin cậy. Trường chứa hàng triệu chữ số gây vấn đề tài nguyên dù mọi ký tự đều đúng cú pháp. Độ dài cho phép phải phù hợp giới hạn số của nguồn; chuỗi quá dài cần lý do từ chối riêng mà không sao chép toàn bộ nội dung vào nhật ký thông thường.
Cả chuỗi thiếu lẫn số nguyên không hợp lệ đều không có số lượng đã phân tích trong ví dụ, nhưng lý do khác nhau. Thiếu số lượng có thể cần hỏi lại nhà cung cấp. Số nguyên không hợp lệ có thể cho thấy định dạng xuất đã đổi hoặc dữ liệu bị gõ nhầm. Gộp cả hai thành một null sẽ làm mất khác biệt phục vụ vận hành.
Thư viện cũng biểu diễn dữ liệu thiếu khác nhau theo kiểu cột. Hướng dẫn dữ liệu thiếu của pandas mô tả các giá trị dạng null và nhu cầu kiểm tra thiếu một cách tường minh. Dù dùng thư viện nào, hãy giữ trường lý do khi khác biệt đó ảnh hưởng việc chấp nhận hoặc diễn giải.
Nhập một phần phải quy định điều gì xảy ra với các dòng bị từ chối. Có thể giữ riêng chúng và công bố dòng được chấp nhận kèm trạng thái chưa đầy đủ, hoặc từ chối cả lô khi thiếu số lượng bắt buộc. Ngưỡng phụ thuộc hợp đồng của bên tiêu thụ. Đối soát tài chính và bản xem trước để khám phá dữ liệu không nhất thiết dùng cùng chính sách.
Quy tắc làm sạch mới cần phiên bản mới
Giả sử thỏa thuận sau này với nhà cung cấp cho phép số lượng âm để biểu diễn hàng trả lại. Xử lý lại chuỗi gốc đã giữ có thể biến bản ghi thứ năm thành biến động âm hợp lệ theo quy tắc mới. Phiên bản lưu kèm giúp phân biệt cách hiểu ấy với lần nhập ban đầu.
Đừng sửa giá trị đã phân tích cũ mà không ghi nhận thay đổi quy tắc nếu cần tái lập báo cáo lịch sử. Chạy lại có thể tạo một phiên bản dữ liệu đã xử lý mới, đồng thời giữ bản trước để so sánh. Người rà soát sẽ kiểm tra được những bản ghi nào đổi và việc đổi đó ảnh hưởng tổng hợp ra sao.
Phiên bản quy tắc cần định danh hành vi thực. Đổi tên phiên bản nhưng vẫn để những ngoại lệ không ghi chép trong các lần sửa bảng tính thủ công không tạo khả năng tái lập. Giữ sửa đổi thủ công trong nhật ký riêng với giá trị gốc, giá trị sửa, lý do và định danh bản ghi áp dụng.
Dữ liệu thô vẫn chịu quy tắc lưu giữ và quyền riêng tư
Giữ đầu vào thô tăng dung lượng và có thể giữ nội dung nhạy cảm đã được loại khỏi bảng sạch. Giới hạn quyền truy cập và thời gian lưu theo mục đích bộ dữ liệu. Khả năng tìm lỗi khi nhập không phải lý do để giữ mọi trường của nhà cung cấp mãi mãi.
Với ví dụ số lượng, bằng chứng tối thiểu hữu ích gồm phiên bản nguồn, định danh bản ghi, chuỗi số lượng gốc, kết quả đã phân tích, lý do từ chối và phiên bản biến đổi. Các cột khác cần có lý do để được giữ. Kiểm tra số 0 hợp lệ, khoảng trắng hai đầu, số không ở đầu, đầu vào thiếu và cú pháp bị từ chối. Sau đó bảo đảm mọi bản ghi nguồn đều tạo kết quả chấp nhận hoặc từ chối để chuyển đổi thất bại không âm thầm biến mất khỏi số đếm lô.
So sánh thay đổi quy tắc trước khi thay bảng đã xử lý
Có thể thử đề xuất cho phép hàng trả lại trên cùng năm chuỗi đã giữ. Bộ phân tích tiếp theo nêu rõ cú pháp được chấp nhận và giới hạn tài nguyên. Nguồn minh họa giới hạn trường gốc ở 64 ký tự và phần số không có dấu ở bốn chữ số. Đây là giới hạn được chọn trong hợp đồng nhà cung cấp, không suy ra từ khả năng chứa số nguyên của Python.
def parse_bounded_quantity(raw, allow_returns):
if type(raw) is not str:
return None, "invalid-type"
if len(raw) > 64:
return None, "field-too-long"
token = raw.strip()
if not token:
return None, "missing"
grammar = r"-?[0-9]+" if allow_returns else r"[0-9]+"
if re.fullmatch(grammar, token) is None:
return None, "invalid-integer"
digits = token[1:] if token.startswith("-") else token
if len(digits) > 4:
return None, "too-many-digits"
return int(token), None
comparison = []
for old in records:
raw = old["raw_quantity"]
before = parse_bounded_quantity(raw, allow_returns=False)
after = parse_bounded_quantity(raw, allow_returns=True)
comparison.append((old["record_number"], raw, before, after))
for record_number, raw, before, after in comparison:
if before != after:
print(record_number, repr(raw), before, "->", after)
for label, offset in [("bounded-v1", 2), ("returns-v2", 3)]:
accepted = [row[offset][0] for row in comparison if row[offset][1] is None]
print(label, "accepted", len(accepted), "sum", sum(accepted))
Chỉ bản ghi năm đổi cách diễn giải: chuỗi gốc -3 chuyển từ số nguyên không hợp lệ thành lượng trả lại âm ba được chấp nhận. Chính sách có giới hạn và chỉ nhận số không âm chấp nhận hai bản ghi với tổng 19. Chính sách hàng trả lại chấp nhận ba bản ghi với tổng 16. Không tổng nào mô tả lô năm bản ghi đầy đủ vì giá trị rỗng và 1O vẫn chưa được giải quyết. Tổng các giá trị được chấp nhận thấp hơn sau thay đổi là điều dự kiến trong trường hợp này, không phải bằng chứng ba đơn vị biến mất trong quá trình truyền dữ liệu.
So sánh dùng cùng bộ phân tích có giới hạn, chỉ tắt hoặc bật hàng trả lại, nên tách riêng được ảnh hưởng của chính sách dấu. Bộ phân tích tối giản trước đó chưa áp dụng giới hạn độ dài này. Đừng gán mã phiên bản cũ cho cách triển khai được bổ sung ràng buộc chỉ vì năm ví dụ thông thường cho cùng hành vi. Phiên bản phải gắn với mã và cấu hình thực tế, gồm giới hạn trường, chuẩn hóa và cách xử lý giá trị bị từ chối.
Lưu ý quy tắc bốn chữ số nói về cách biểu diễn trong nguồn, không chỉ giá trị số. 00007 bị từ chối dù biểu diễn bảy, còn 0007 được chấp nhận. Nếu thỏa thuận chỉ giới hạn giá trị số đến 9999 nhưng cho phép số không ở đầu không giới hạn, đó là cú pháp và chính sách tài nguyên khác. Kiểm tra khác biệt trước khi tuyên bố hai phiên bản phân tích tương đương. Tương tự, -0 được nhận khi bật hàng trả lại và trở thành số nguyên không; chuỗi được giữ vẫn bảo toàn dấu gốc dù biểu diễn số không làm được điều đó.
Tách bằng chứng ở cấp trường khỏi bằng chứng ở cấp tệp
Số lượng gốc chỉ là gốc xét theo bước làm sạch nghiệp vụ. Nó đã là trường CSV được giải mã. Dấu nháy chỉ dùng để đóng khung CSV đã bị bỏ, còn dấu nháy nhân đôi đã được bộ phân tích diễn giải. Xuất lại trường ấy không tái tạo được chính xác byte đầu vào, mã hóa hay ký tự kết thúc dòng. Giữ phiên bản đối tượng nguồn được phép lưu hoặc bản chụp tệp bất biến khi cần tái lập ở cấp byte, cùng cấu hình bộ phân tích và số bản ghi logic.
Giá trị băm có thể phát hiện byte của tệp đã đổi, nhưng không phải bản sao lưu hay phép biến đổi bảo vệ quyền riêng tư. Nếu tệp gốc đã bị xóa, giá trị băm không thể khôi phục nó để chạy lại. Nếu băm một giá trị cá nhân dễ đoán, người khác có thể so các phỏng đoán với nó. Dùng định danh tệp cho nguồn gốc dữ liệu mà không coi định danh ấy là quyền công khai trường nhạy cảm hoặc giữ chúng vô thời hạn.
Với bài tập tái lập, đưa vào bộ phân tích có giới hạn các chuỗi "0", "-0", "00007", chuỗi ký tự toàn chiều rộng "12" và 65 dấu cách ASCII. Khi bật hàng trả lại, kết quả lần lượt là không, không, quá nhiều chữ số, số nguyên không hợp lệ và trường quá dài. Trường hợp cuối bị loại ở bước kiểm tra độ dài gốc trước khi bỏ khoảng trắng; một trường trống quá lớn không được phân loại như giá trị thiếu thông thường. Gắn định danh bản ghi gốc vào mỗi kết quả rồi kiểm tra tổng số chấp nhận và từ chối vẫn bằng số đầu vào. Bài thử kiểm tra cả phép biến đổi lẫn bằng chứng cần để giải thích nó sau này.