Leer o escribir un archivo CSV es un caso de uso muy común que los desarrolladores de Java encuentran en su trabajo diario.
Si necesita una forma sencilla de leer un archivo CSV o generar uno nuevo para su proyecto, este artículo es para ti.
En esta publicación, aprenderas a leer y escribir archivos CSV en Java utilizando una biblioteca de código abierto muy simple llamada Apache Commons CSV.
Dependencias
Para realizar este cometido utilizaremos una dependencia de una librería de apache commons para la lectura de CSV.
Antes que nada añadimos la respectiva dependencia, si usas maven agregue el siguiente código en el archivo pom.xml
:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.5</version> </dependency>
Ahora si usas gradle deberas agregar la siguiente línea en el archivo build.gradle
:
compile "org.apache.commons:commons-csv:1.5"
Archivo ejemplo CSV
En este ejemplo vamos a procesar un archivo csv, el mismo contendra la siguiente información y estructura. El primero sin headers al cual llamaremos users.csv:
Edy Huiza Yampasi,edy.huiza@rootnite.com,+59161199411,Bolivia Sachin Tendulkar,sachin@example.com,+91-9999999998,India Barak Obama,barak.obama@example.com,+1-1111111111,United States Donald Trump,donald.trump@example.com,+1-2222222222,United States
Y el Segundo con headers al que nombraremos como users-with-header.csv:
Name,Email,Phone,Country Edy Huiza Yampasi,edy.huiza@rootnite.com,+59161199411,Bolivia Sachin Tendulkar,sachin@example.com,+91-9999999998,India Barak Obama,barak.obama@example.com,+1-1111111111,United States Donald Trump,donald.trump@example.com,+1-2222222222,United States
Lectura de un archivo CSV (valores de acceso por índice de columnas)
El ejemplo a continuación muestra cómo se puede leer y analizar el archivo CSV de muestra users.csv descrito anteriormente utilizando Apache Commons CSV.
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import java.io.IOException; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Paths; public class BasicCSVReader { private static final String SAMPLE_CSV_FILE_PATH = "./users.csv"; public static void main(String[] args) throws IOException { try ( Reader reader = Files.newBufferedReader(Paths.get(SAMPLE_CSV_FILE_PATH)); CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT); ) { for (CSVRecord csvRecord : csvParser) { // Accediendo a los valores por el indice de la columna String name = csvRecord.get(0); String email = csvRecord.get(1); String phone = csvRecord.get(2); String country = csvRecord.get(3); System.out.println("Record No - " + csvRecord.getRecordNumber()); System.out.println("---------------"); System.out.println("Name : " + name); System.out.println("Email : " + email); System.out.println("Phone : " + phone); System.out.println("Country : " + country); System.out.println("---------------\n\n"); } } } }
Creamos un BufferedReader para el archivo de muestra y lo pasamos a CSVParser con un formato CSV predeterminado. Una vez que tenemos un CSVParser, podemos iterar sobre todos los registros uno por uno usando un ciclo for.
La clase CSVParser también proporciona un método llamado getRecords() para leer todos los registros a la vez en la memoria.
Lectura de un archivo CSV (valores de acceso por nombres asignados a cada columna)
En el ejemplo anterior, accedimos a los valores en cada registro usando su índice de columna. Si no desea utilizar índices de columna para recuperar los valores en cada registro, puede asignar nombres a cada columna en el archivo CSV y recuperar los valores con los nombres asignados.
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.nio.file.Files; import java.nio.file.Paths; public class CSVReaderWithManualHeader { private static final String SAMPLE_CSV_FILE_PATH = "./users-with-header.csv"; public static void main(String[] args) throws IOException { try ( Reader reader = Files.newBufferedReader(Paths.get(SAMPLE_CSV_FILE_PATH)); CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT .withHeader("Name", "Email", "Phone", "Country") .withIgnoreHeaderCase() .withTrim()); ) { for (CSVRecord csvRecord : csvParser) { // Accediendo a los valores por el nombre asignado en cada columna String name = csvRecord.get("Name"); String email = csvRecord.get("Email"); String phone = csvRecord.get("Phone"); String country = csvRecord.get("Country"); System.out.println("Record No - " + csvRecord.getRecordNumber()); System.out.println("---------------"); System.out.println("Name : " + name); System.out.println("Email : " + email); System.out.println("Phone : " + phone); System.out.println("Country : " + country); System.out.println("---------------\n\n"); } } } }
Tenga en cuenta que también hemos especificado algunas configuraciones adicionales como withIgnoreHeaderCase() y withTrim() con CSVFormat.
La configuración ignoreHeaderCase se utiliza para hacer que los nombres de los encabezados no distingan entre mayúsculas y minúsculas, y la configuración de recorte recorta los espacios en blanco iniciales y finales de los valores de columna.
Generando un archivo CSV
Finalmente, vamos a mostrar un ejemplo de como crear archivos CSV con esta librería.
import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; import java.io.*; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; public class CSVWriter { private static final String SAMPLE_CSV_FILE = "./sample.csv"; public static void main(String[] args) throws IOException { try ( BufferedWriter writer = Files.newBufferedWriter(Paths.get(SAMPLE_CSV_FILE)); CSVPrinter csvPrinter = new CSVPrinter(writer, CSVFormat.DEFAULT .withHeader("ID", "Name", "Designation", "Company")); ) { csvPrinter.printRecord("1", "Edy Huiza Yampasi","CEO", "RootNite"); csvPrinter.printRecord("2", "Satya Nadella", "CEO", "Microsoft"); csvPrinter.printRecord("3", "Tim cook", "CEO", "Apple"); csvPrinter.printRecord(Arrays.asList("4", "Mark Zuckerberg", "CEO", "Facebook")); csvPrinter.flush(); } } }
Este ejemplo generara un archivo CSV con el siguiente contenido.
ID,Name,Designation,Company 1,Edy Huiza Yampasi,CEO,RootNite 2,Satya Nadella,CEO,Microsoft 3,Tim cook,CEO,Apple 4,Mark Zuckerberg,CEO,Facebook
Conclusión
En este artículo hemos visto que utilizando esta librería podemos leer y crear archivos CSV de forma muy sencilla y fácil.
Así mismo como en todos los artículos de nuestro Blog, recomendamos la lectura y consulta para cualquier duda, la documentación oficial de la librería apache commons csv.