將 CSV 標頭讀入列表
1. 概述
在這個簡短的教學中,我們將探索在 Java 中將 CSV 標頭讀取到清單中的不同方法。
首先,我們將學習如何使用 JDK 類別來執行此操作。然後,我們將了解如何使用 OpenCSV 和 Apache Commons CSV 等外部函式庫來實現相同的目標。
2.使用BufferedReader
BufferedReader類別提供了應對我們挑戰的最簡單的解決方案。它提供了一種快速有效的讀取 CSV 檔案的方法,因為它透過逐塊讀取內容來減少 IO 操作的數量。
那麼,讓我們看看它的實際效果:
class CsvHeadersAsListUnitTest {
private static final String CSV_FILE = "src/test/resources/employees.csv";
private static final String COMMA_DELIMITER = ",";
private static final List<String> EXPECTED_HEADERS = List.of("ID", "First name", "Last name", "Salary");
@Test
void givenCsvFile_whenUsingBufferedReader_thenGetHeadersAsList() throws IOException {
try (BufferedReader reader = new BufferedReader(new FileReader(CSV_FILE))) {
String csvHeadersLine = reader.readLine();
List<String> headers = Arrays.asList(csvHeadersLine.split(COMMA_DELIMITER));
assertThat(headers).containsExactlyElementsOf(EXPECTED_HEADERS);
}
}
}
正如我們所看到的,我們使用 try-with-resources 來建立一個BufferedReader實例。這樣,我們就可以確保文件隨後被關閉。此外,我們呼叫一次readLine()方法來提取表示 headers 的第一行。最後,我們使用split()方法和Arrays#asList來取得標題作為清單。
3. 使用Scanner
Scanner類別提供了另一種解決方案來實現相同的結果。顧名思義,它掃描並讀取給定文件的內容。那麼,讓我們新增另一個測試案例來看看如何使用Scanner讀取 CSV 檔案頭:
@Test
void givenCsvFile_whenUsingScanner_thenGetHeadersAsList() throws IOException {
try(Scanner scanner = new Scanner(new File(CSV_FILE))) {
String csvHeadersLine = scanner.nextLine();
List<String> headers = Arrays.asList(csvHeadersLine.split(COMMA_DELIMITER));
assertThat(headers).containsExactlyElementsOf(EXPECTED_HEADERS);
}
}
類似地, Scanner類別具有nextLine()方法,我們可以使用它來取得輸入檔案的第一行。在這裡,第一行代表 CSV 檔案的標題。
4. 使用 OpenCSV
或者,我們可以使用 OpenCSV 函式庫來讀取特定 CSV 檔案的標頭。在深入討論之前,讓我們將其Maven 依賴項新增至pom.xml檔中:
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.9</version>
</dependency>
通常, OpenCSV 附帶一組現成的類別和方法,用於讀取和解析 CSV 檔案。那麼,讓我們透過一個實際的例子來說明這個函式庫的使用:
@Test
void givenCsvFile_whenUsingOpenCSV_thenGetHeadersAsList() throws CsvValidationException, IOException {
try (CSVReader csvReader = new CSVReader(new FileReader(CSV_FILE))) {
List<String> headers = Arrays.asList(csvReader.readNext());
assertThat(headers).containsExactlyElementsOf(EXPECTED_HEADERS);
}
}
正如我們在上面看到的,OpenCSV 提供了CSVReader類別來讀取給定檔案的內容。 CSVReader類別提供readNext()方法來直接以String陣列形式檢索下一個第一行。
5. 使用 Apache Commons CSV
另一個解決方案是使用 Apache Commons CSV 函式庫。顧名思義,它提供了幾個用於建立和讀取 CSV 檔案的便捷功能。
首先,我們需要將其依賴項的最新版本新增至pom.xml :
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.11.0</version>
</dependency>
簡而言之,Apache Commons CSV 的CSVParser類別提供getHeaderNames()方法來傳回標頭名稱的唯讀清單:
@Test
void givenCsvFile_whenUsingApacheCommonsCsv_thenGetHeadersAsList() throws IOException {
CSVFormat csvFormat = CSVFormat.DEFAULT.builder()
.setDelimiter(COMMA_DELIMITER)
.setHeader()
.build();
try (BufferedReader reader = new BufferedReader(new FileReader(CSV_FILE));
CSVParser parser = CSVParser.parse(reader, csvFormat)) {
List<String> headers = parser.getHeaderNames();
assertThat(headers).containsExactlyElementsOf(EXPECTED_HEADERS);
}
}
在這裡,我們使用CSVParser類別根據指定的格式解析輸入檔。借助setHeader()方法,可以自動從輸入檔中解析標頭。
六,結論
在這篇短文中,我們探索了以清單形式讀取 CSV 檔案標題的不同解決方案。
首先,我們學習如何使用 JDK 來做到這一點。然後,我們了解如何使用外部函式庫來實現相同的目標。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。