Giải mã CSV Bưu chính Nhật Bản: Cơn ác mộng của lập trình viên
Bài viết phân tích chi tiết những vấn đề kỳ lạ trong tệp CSV dữ liệu bưu chính của Nhật Bản (ken_all.csv) — từ việc tách dòng tùy tiện, chú thích không cần thiết cho đến romaji sai tệ. Tác giả đã phát triển thư viện posuto để xử lý dữ liệu này, nhưng hành trình đó là một bài học cay đắng về độ phức tạp tiềm ẩn trong một định dạng tưởng chừng đơn giản.

Giải mã CSV Bưu chính Nhật Bản: Cơn ác mộng của lập trình viên
Dữ liệu bưu chính của Nhật Bản là nguồn được sử dụng rộng rãi nhưng lại nổi tiếng là cực kỳ khó phân tích. Trong bài viết này, tác giả không chỉ chỉ ra những lỗi thiết kế nghiêm trọng trong tệp ken_all.csv mà còn giới thiệu thư viện posuto — một giải pháp giúp lập trình viên vượt qua "địa ngục phân tích" này. Từ các dòng bị tách một cách vô lý, chú thích gây hiểu lầm, đến romaji sai bét, tất cả đều được phơi bày một cách chi tiết và có phần hài hước.
Nguồn dữ liệu "may mắn" khi còn tồn tại
Cuối năm ngoái, tác giả phát hành posuto — một gói phần mềm giúp truy cập dữ liệu bưu chính Nhật Bản một cách dễ dàng. Dữ liệu gốc do Bưu chính Nhật Bản (Japan Post) phát hành, và ngay từ cái nhìn đầu tiên, tác giả đã gặp một vấn đề nhức nhối: khi nhập mã bưu chính vào một biểu mẫu trực tuyến, hệ thống tự động điền địa chỉ thành "XXX-quận (trừ các tòa nhà sau)". Anh không hiểu cụm từ trong ngoặc là gì, nên đã truy tìm nguồn gốc và phát hiện ra một trong những quyết định thiết kế kỳ lạ nhất của Japan Post: tệp CSV chứa các ghi chú bằng ngoặc đơn dành cho người đọc tệp thủ công, thay vì thêm một trường dữ liệu riêng.
Vấn đề thứ nhất: Dòng bị tách theo "luật bất thành văn"
Tệp CSV này có một quy tắc — không hề có lời giải thích — là nếu tên khu phố dài hơn 38 ký tự, hoặc trường phát âm katakana nửa độ dài dài hơn 76 ký tự, thì dòng đó sẽ bị tách thành nhiều dòng. Các trường khác bị lặp lại, còn phần tên dài sẽ được nối tiếp ở dòng sau. Kết quả là dữ liệu trông như thế này:
12345,Tokyo,Minato,Tên khu này thật sự rất
12345,Tokyo,Minato,dài và không thể vừa
12345,Tokyo,Minato,một dòng duy nhất nên họ
12345,Tokyo,Minato,đã phải cắt nó ra
Điều kỳ lạ hơn nữa là vị trí ngắt dòng hoàn toàn ngẫu nhiên, không tuân theo giới hạn ký tự hay bất kỳ ranh giới nào của từ. Tác giả cho rằng có thể 30 năm trước, hệ thống xử lý của Japan Post có một bộ đệm có độ rộng cố định cho mỗi dòng, nhưng chưa từng thấy ai làm như vậy trong suốt sự nghiệp xử lý hàng trăm định dạng tệp tin khác nhau.
Tệ hơn nữa: Romaji sai đến mức "alphabet soup"
Không chỉ dừng lại ở việc tách dòng, Japan Post còn cung cấp một tệp romaji riêng — chuyển đổi tên địa danh sang chữ Latinh. Tuy nhiên, chất lượng của bản chuyển ngữ này cực kỳ kém. Một ví dụ điển hình:
- 大手町 JAビル được chuyển thành "OTEMACHI JIEIEIBIRU" thay vì "OTEMACHI JA Building".
Vấn đề là "JA" bị đọc theo âm tiếng Nhật là "ジェイエイ", rồi từ đó chuyển thành "jie" bằng cách xử lý sai ký tự nhỏ "ェ". Kết quả khiến một chuỗi vốn đã là chữ Latinh trở thành hỗn hợp vô nghĩa. Những trường hợp khác như "Roppongi Hills" thành "Roppongihiruzu", "Sweden Hills" thành "Suedenhiruzu" cũng khiến bất cứ ai yêu ngôn ngữ phải lắc đầu.
Những vấn đề mang tính "địa phương" khó lường
Ngoài các lỗi kỹ thuật, còn có những vấn đề xuất phát từ đặc thù địa lý và văn hóa. Mã bưu chính 〒452-0961 ở vùng Haruhi, thành phố Kiyosu, tỉnh Aichi có tới 66 dòng vì mỗi khu phố nhỏ đều được liệt kê riêng. Trong khi đó, mã 〒602-8368 hoặc 〒602-8374 ở Kyoto — nơi sử dụng hệ thống địa chỉ giao cắt kỳ lạ — phải cần tới 8 dòng để mô tả một địa điểm.
Ngay cả các chú thích trong ngoặc cũng gây rắc rối. Ví dụ, chuỗi "一円" thông thường nghĩa là "một yên", nhưng trong ngữ cảnh bưu chính, nó có nghĩa là "khu vực xung quanh" và cần được loại bỏ khỏi tên khu phố — ngoại trừ đúng một khu phố ở Shiga có tên là 〒522-0317 mà đó lại là tên thật.
Giải pháp từ cộng đồng
Nhận thức được sự phức tạp này, tác giả đã xây dựng posuto — không chỉ là một thư viện Python, mà còn cung cấp dữ liệu JSON đã được xử lý sẵn để mọi lập trình viên (dù không dùng Python) đều có thể tải về và sử dụng. Anh cũng khuyến nghị thay vì dùng romaji của Japan Post, hãy sử dụng thư viện cutlet để có kết quả chuyển ngữ chính xác hơn nhiều.
"Xử lý tệp này là một bài học khiêm tốn về mức độ phức tạp khổng lồ mà con người có thể nhồi nhét vào một nơi tưởng chừng đơn giản."
Và nếu bạn cần một chương trình DOS hoặc Windows 3.1 để ghi dữ liệu vào đĩa mềm IBM H, thì đừng lo — trang chủ của Japan Post vẫn còn cung cấp. Đúng vậy, đĩa mềm IBM H.
Ảnh minh họa nhân vật dễ thương
Hình ảnh nhân vật dễ thương này do Irasutoya vẽ, nhưng dữ liệu CSV thô của bưu chính thì chẳng dễ thương chút nào.
Câu chuyện đằng sau tệp CSV bưu chính Nhật Bản là một minh chứng rõ ràng rằng: trong thế giới công nghệ, không có gì gọi là "đơn giản" — chỉ có những vấn đề chưa được ai đi sâu tìm hiểu mà thôi. Nếu bạn từng gặp phải một định dạng dữ liệu tồi tệ, hãy nhớ rằng ít nhất, nó chưa tệ đến mức phải bị trừng phạt bằng việc phân tích ken_all.csv vĩnh viễn ở địa ngục.