Giới thiệu về Apache Commons CSV

1. Khái quát chung

Thư viện CSV của Apache Commons có nhiều tính năng hữu ích để tạo và đọc tệp CSV.

Trong hướng dẫn nhanh này, chúng ta sẽ xem cách sử dụng thư viện này bằng cách hiển thị một ví dụ đơn giản.

2. Sự phụ thuộc của Maven

Để bắt đầu, chúng tôi sẽ nhập phiên bản mới nhất của thư viện này bằng Maven:

 org.apache.commons commons-csv 1.4  

Để kiểm tra phiên bản mới nhất của thư viện này - hãy truy cập vào đây.

3. Đọc tệp CSV

Hãy xem xét tệp CSV sau có tên book.csv chứa các thuộc tính của sách:

author,title Dan Simmons,Hyperion Douglas Adams,The Hitchhiker's Guide to the Galaxy

Hãy xem cách chúng ta có thể đọc nó:

Map AUTHOR_BOOK_MAP = new HashMap() { { put("Dan Simmons", "Hyperion"); put("Douglas Adams", "The Hitchhiker's Guide to the Galaxy"); } }); String[] HEADERS = { "author", "title"}; @Test public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException { Reader in = new FileReader("book.csv"); Iterable records = CSVFormat.DEFAULT .withHeader(HEADERS) .withFirstRecordAsHeader() .parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); assertEquals(AUTHOR_BOOK_MAP.get(author), title); } }

Chúng tôi đang đọc các bản ghi của tệp CSV sau khi bỏ qua dòng đầu tiên vì nó là tiêu đề.

Có nhiều loại CSVFormat chỉ định định dạng của tệp CSV, bạn có thể xem ví dụ về định dạng này trong đoạn tiếp theo.

4. Tạo tệp CSV

Hãy xem cách chúng ta có thể tạo cùng một tệp CSV như trên:

public void createCSVFile() throws IOException { FileWriter out = new FileWriter("book_new.csv"); try (CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT .withHeader(HEADERS))) { AUTHOR_BOOK_MAP.forEach((author, title) -> { printer.printRecord(author, title); }); } }

Tệp CSV mới sẽ được tạo với các tiêu đề thích hợp vì chúng tôi đã chỉ định chúng trong khai báo CSVFormat của mình .

5. Tiêu đề & Cột đọc

Có nhiều cách khác nhau để đọc và viết tiêu đề. Tương tự, có nhiều cách khác nhau để đọc giá trị cột.

Hãy xem qua từng cái một:

5.1. Truy cập các cột theo chỉ mục

Đây là cách cơ bản nhất để đọc giá trị cột. Điều này có thể được sử dụng khi tiêu đề cho tệp CSV không được biết:

Reader in = new FileReader("book.csv"); Iterable records = CSVFormat.DEFAULT.parse(in); for (CSVRecord record : records) { String columnOne = record.get(0); String columnTwo = record.get(1); }

5.2. Truy cập các cột theo các tiêu đề được xác định trước

Đây là một cách trực quan hơn để truy cập các cột khi so sánh với việc truy cập theo các chỉ số:

Iterable records = CSVFormat.DEFAULT .withHeader("author", "title").parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); }

5.3. Sử dụng Enums làm tiêu đề

Sử dụng Chuỗi để truy cập các giá trị cột có thể dễ xảy ra lỗi. Sử dụng Enums thay vì Strings sẽ làm cho mã chuẩn hơn và dễ hiểu hơn:

enum BookHeaders { author, title } Iterable records = CSVFormat.DEFAULT .withHeader(BookHeaders.class).parse(in); for (CSVRecord record : records) { String author = record.get(BookHeaders.author); String title = record.get(BookHeaders.title); }

5.4. Bỏ qua dòng tiêu đề

Thông thường, các tệp CSV chứa tiêu đề ở dòng đầu tiên. Do đó, trong hầu hết các trường hợp, có thể an toàn bỏ qua nó và bắt đầu đọc từ hàng thứ hai.

Điều này sẽ tự động phát hiện tiêu đề truy cập các giá trị cột:

Iterable records = CSVFormat.DEFAULT .withFirstRowAsHeader().parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); }

5.5. Tạo tệp có tiêu đề

Tương tự, chúng ta có thể tạo tệp CSV với dòng đầu tiên chứa các tiêu đề:

FileWriter out = new FileWriter("book_new.csv"); CSVPrinter printer = CSVFormat.DEFAULT .withHeader("author", "title").print(out);

6. Kết luận

Chúng tôi đã trình bày việc sử dụng thư viện Commons CSV của Apache thông qua một ví dụ đơn giản. Bạn có thể đọc thêm về thư viện tại đây.

Mã cho bài viết này có sẵn trên Github.