Чтение CSV-файлов с использованием библиотеки OpenCSV
На этом этапе мы реализуем третий подход к чтению CSV-файлов с использованием библиотеки OpenCSV. OpenCSV - это сторонняя библиотека, которая предоставляет надежные возможности парсинга CSV, обрабатывая сложные сценарии, такие как поля, содержащие запятые или переносы строк, заключенные в кавычки.
Понимание OpenCSV
OpenCSV - это библиотека для парсинга CSV на Java, которая поддерживает все основные вариации формата CSV. В отличие от предыдущих подходов, OpenCSV правильно обрабатывает поля в кавычках, содержащие запятые, разрывы строк и другие специальные символы, которые иначе могут нарушить простое разделение по запятым.
Настройка OpenCSV
Сначала давайте скачаем библиотеку OpenCSV и ее зависимости:
cd ~/project
mkdir -p lib
curl -L -o lib/opencsv-5.7.1.jar https://repo1.maven.org/maven2/com/opencsv/opencsv/5.7.1/opencsv-5.7.1.jar
curl -L -o lib/commons-lang3-3.12.0.jar https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.12.0/commons-lang3-3.12.0.jar
curl -L -o lib/commons-text-1.10.0.jar https://repo1.maven.org/maven2/org/apache/commons/commons-text/1.10.0/commons-text-1.10.0.jar
curl -L -o lib/commons-beanutils-1.9.4.jar https://repo1.maven.org/maven2/commons-beanutils/commons-beanutils/1.9.4/commons-beanutils-1.9.4.jar
curl -L -o lib/commons-collections-3.2.2.jar https://repo1.maven.org/maven2/commons-collections/commons-collections/3.2.2/commons-collections-3.2.2.jar
curl -L -o lib/commons-logging-1.2.jar https://repo1.maven.org/maven2/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
Создание более сложного CSV-файла
Давайте создадим более сложный CSV-файл, который включает поля в кавычках с запятыми:
echo 'name,description,price
"Laptop","High-performance laptop, with SSD",999.99
"Smartphone","Latest model, with dual camera",499.99
"Headphones","Noise-canceling, wireless",149.99' > ~/project/products.csv
Реализация чтения CSV с использованием OpenCSV
Теперь давайте обновим файл CSVReaderDemo.java
, чтобы прочитать CSV-файл с использованием OpenCSV. Замените весь контент файла следующим кодом:
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;
import java.io.FileReader;
import java.io.IOException;
public class CSVReaderDemo {
public static void main(String[] args) {
System.out.println("Reading CSV using OpenCSV");
// Path to our CSV file with complex data
String csvFile = "products.csv";
try (CSVReader reader = new CSVReader(new FileReader(csvFile))) {
// Read and print the header
String[] header = reader.readNext();
if (header != null) {
System.out.println("\nHeader: " + String.join(", ", header));
}
// Read and print each line
String[] nextLine;
int rowNumber = 1;
System.out.println("\nData read from CSV file:");
while ((nextLine = reader.readNext()) != null) {
System.out.println("Row " + rowNumber + ":");
for (int i = 0; i < nextLine.length; i++) {
System.out.println(" " + header[i] + ": " + nextLine[i]);
}
rowNumber++;
System.out.println();
}
} catch (IOException | CsvValidationException e) {
System.err.println("Error reading the CSV file: " + e.getMessage());
e.printStackTrace();
}
}
}
Давайте скомпилируем и запустим наш обновленный код:
cd ~/project
javac -cp ".:lib/*" -d . src/CSVReaderDemo.java
java -cp ".:lib/*" CSVReaderDemo
Вы должны увидеть вывод, похожий на следующий:
Reading CSV using OpenCSV
Header: name, description, price
Data read from CSV file:
Row 1:
name: Laptop
description: High-performance laptop, with SSD
price: 999.99
Row 2:
name: Smartphone
description: Latest model, with dual camera
price: 499.99
Row 3:
name: Headphones
description: Noise-canceling, wireless
price: 149.99
Пояснение к коду
- Мы импортируем необходимые классы из библиотеки OpenCSV и пакета Java I/O.
- Мы определяем путь к нашему CSV-файлу (
products.csv
).
- Мы создаем объект
CSVReader
для чтения CSV-файла.
- Мы читаем строку заголовка с помощью
reader.readNext()
и сохраняем ее для дальнейшего использования.
- Затем мы читаем каждую последующую строку с помощью
reader.readNext()
в цикле, пока не закончатся строки.
- Для каждой строки мы выводим каждое поле вместе с соответствующим заголовком.
Библиотека OpenCSV автоматически обрабатывает сложное форматирование CSV, правильно парся поля с запятыми, заключенными в кавычки. Это делает ее идеальным выбором для реальных CSV-файлов, которые могут содержать сложные данные.
Преимущества OpenCSV
OpenCSV имеет несколько преимуществ по сравнению с базовыми подходами:
- Она правильно обрабатывает поля в кавычках, содержащие запятые, переносы строк и другие специальные символы.
- Она предоставляет встроенную поддержку для чтения в объекты (Java-объекты).
- Она поддерживает расширенные функции, такие как пользовательские разделители, символы кавычек и символы экранирования.
- Она эффективно обрабатывает большие CSV-файлы.
Для большинства реальных приложений, работающих с CSV-файлами, использование специальной библиотеки, такой как OpenCSV, является рекомендуемым подходом.