Kĩ thuật đọc header của tập tin CSV có định dạng tiếng Nhật

Xin chào mọi người lại là mình đây chắc cũng khuya rồi nên nay viết một bài nhẹ nhẹ chia sẻ chút về việc đọc header trong tập tin CSV tiếng Nhật nha (.csv). Thường các tập tin tiếng Nhật có định dạng rất khó chịu khi chúng ta xử lý họ thường đính kèm thêm các chuỗi kí tự lạ vào đầu file hoặc đầu mỗi dòng vì thế chúng ta phải cận thận. Hay gần đây thì mình có gặp file không có đuôi định dạng và được họ compile rồi sau đó yêu cầu chúng ta xử lý với file đó 😀 

Lan man thế đủ rồi vào vấn đề chính thôi, mình đã thử đọc header bằng một số thư viện như OpenCSV, CSVParser và các lớp có sẵn của Java như Scanner và FileInputStream (đọc trực tiếp) đều gây ra lỗi định dạng kí tự đặc biệt vì thế mình quyết định dùng cách lấy thẳng MultipartFile sau đó parse file đó qua Bytes thì ok tuyệt vời. Sau đây là cách xử lý của mình:

try {

            byte[] bytes = file.getBytes();

            String body = new String(bytes, StandardCharsets.UTF_8).trim().replaceAll("[\"]", "");

            BufferedReader input = new BufferedReader(new StringReader(body));

            String line;

            int lineIndex = 0;

            while ((line = input.readLine()) != null) {

                if(lineIndex > 1) {

                    break;

                }

                String UTF8_BOM = "\uFEFF";

                if (line.startsWith(UTF8_BOM)) {

                    line = line.substring(1);

                }

                String[] row = line.replaceAll(" ", "").split(",");

                if (lineIndex > 0) {

                    // process with body of CSV file

                }

                else {

                    if (row.length != headerArr.length) {

                        // check number of CSV header

                    }

                    for(int i = 0; i < row.length; i++) {

                        if (!row[i].equals(headerArr[i])) {

                            // check header with list header (validate CSV file is right format or not

                        }

                    }

                }

                lineIndex++;

            }

        }

        catch (Exception e) {

            e.printStackTrace();

        }

    }

Ok ha đầu tiên file ở đây là MultipartFile còn nếu các bạn truyền vào là File thì các bạn tìm cách thử xem File thì sẽ sử lý trong tiếng Nhật thế nào nhé. Mình getBytes() từ file đó ra thành mảng byte[], sau đó đưa mảng đó về String , bỏ dấu cách và các dấu \ thường là format bên Nhật. Tiếp theo sử dụng BufferedReader để đọc chuỗi String mình vừa parser được ha 😀

Tiếp theo thì ta đọc từng dòng của nó thôi và sử dụng lineIndex để check header và phần body của nó. Ở đây là logic code của mình thôi mọi người có thể chính sửa theo ý mọi người, phần mình nhắc đến đầu bài là các kí tự lạ trong tiếng Nhật chúng ta nên open file csv bằng Notepad++ kiểm tra coi phía đầu file có các kí tự được chèn hay không nó được gọi là BOM nếu có thì ta subString() dòng đọc của chúng ta nhé. À quên mất đọc từng dòng thì dùng lệnh (line = input.readLine()) != null để check. 

Sau khi đã loại bỏ các kí tự đặc biệt và các chuỗi bị chèn vào thì ta đưa header này vào mảng bằng hàm split(). Sau đó mảng header đã có từ đó mà chúng ta lần lượt check các index của header trong mảng có khớp với header format của File yêu cầu hay không nếu đúng thì cho upload file còn không thì thông báo lỗi cho người dùng. Ở đây mình ứng dụng cho việc:
+ Validate định dạng File với header
+ Xử lý với các tập tin tiếng Nhật có kí tự lạ
+ Một cách để đọc file được người dùng upload lên server

Trên đây là chia sẻ và thủ thuật nhỏ của mình, nếu mọi người có đóng góp gì có thể bình luận và chia sẻ, góp ý bên dưới nhé. Cảm ơn tất cả mọi người!

Advertisements

One comment

Để lại bình luận

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s