Lectura de archivos CSV utilizando la biblioteca OpenCSV
En este paso, implementaremos nuestro tercer enfoque para leer archivos CSV utilizando la biblioteca OpenCSV. OpenCSV es una biblioteca de terceros que ofrece capacidades sólidas de análisis (parsing) de archivos CSV, manejando escenarios complejos como campos que contienen comas o saltos de línea encerrados entre comillas.
Comprender OpenCSV
OpenCSV es una biblioteca de análisis de archivos CSV para Java que admite todas las variaciones básicas del formato CSV. A diferencia de los enfoques anteriores, OpenCSV maneja adecuadamente los campos entre comillas que contienen comas, saltos de línea y otros caracteres especiales que, de otro modo, harían que la simple división por comas fallara.
Configurar OpenCSV
Primero, descarguemos la biblioteca OpenCSV y sus dependencias:
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
Crear un archivo CSV más complejo
Creemos un archivo CSV más complejo que incluya campos entre comillas con comas:
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
Implementar la lectura de CSV con OpenCSV
Ahora, actualicemos nuestro archivo CSVReaderDemo.java
para leer el archivo CSV utilizando OpenCSV. Reemplace todo el contenido del archivo con el siguiente código:
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();
}
}
}
Compilémos y ejecutemos nuestro código actualizado:
cd ~/project
javac -cp ".:lib/*" -d . src/CSVReaderDemo.java
java -cp ".:lib/*" CSVReaderDemo
Deberías ver una salida similar a esta:
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
Explicación del código
- Importamos las clases necesarias de la biblioteca OpenCSV y de la entrada/salida de Java.
- Definimos la ruta a nuestro archivo CSV (
products.csv
).
- Creamos un objeto
CSVReader
para leer el archivo CSV.
- Leemos la fila de encabezado con
reader.readNext()
y la almacenamos para su uso posterior.
- Luego, leemos cada fila subsiguiente con
reader.readNext()
en un bucle hasta que no haya más filas.
- Para cada fila, imprimimos cada campo junto con su encabezado correspondiente.
La biblioteca OpenCSV maneja automáticamente el formato CSV complejo, analizando correctamente los campos con comas encerradas entre comillas. Esto la hace ideal para archivos CSV del mundo real que pueden contener datos complejos.
Ventajas de OpenCSV
OpenCSV ofrece varias ventajas sobre los enfoques básicos:
- Maneja correctamente los campos entre comillas que contienen comas, saltos de línea y otros caracteres especiales.
- Proporciona soporte integrado para leer en beans (objetos Java).
- Admite características avanzadas como separadores personalizados, caracteres de comilla y caracteres de escape.
- Maneja eficientemente archivos CSV grandes.
Para la mayoría de las aplicaciones del mundo real que trabajan con archivos CSV, se recomienda utilizar una biblioteca dedicada como OpenCSV.