Introducción a Apache Commons CSV

1. Información general

La biblioteca CSV de Apache Commons tiene muchas funciones útiles para crear y leer archivos CSV.

En este tutorial rápido, veremos cómo utilizar esta biblioteca mostrando un ejemplo simple.

2. Dependencia de Maven

Para comenzar, importaremos la última versión de esta biblioteca usando Maven:

 org.apache.commons commons-csv 1.4  

Para buscar la versión más reciente de esta biblioteca, vaya aquí.

3. Lectura de un archivo CSV

Considere el siguiente archivo CSV llamado book.csv que contiene los atributos de un libro:

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

Veamos cómo podemos leerlo:

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); } }

Estamos leyendo los registros de un archivo CSV después de omitir la primera línea, ya que es el encabezado.

Existen diferentes tipos de CSVFormat que especifican el formato del archivo CSV, un ejemplo del cual puede ver en el siguiente párrafo.

4. Creación de un archivo CSV

Veamos cómo podemos crear el mismo archivo CSV que el anterior:

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); }); } }

El nuevo archivo CSV se creará con los encabezados adecuados porque los hemos especificado en nuestra declaración CSVFormat .

5. Encabezados y columnas de lectura

Hay diferentes formas de leer y escribir encabezados. Del mismo modo, existen diferentes formas de leer los valores de las columnas.

Repasemos uno por uno:

5.1. Acceso a columnas por índice

Esta es la forma más básica de leer valores de columna. Esto se puede usar cuando no se conocen los encabezados de los archivos CSV:

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. Acceder a columnas mediante encabezados predefinidos

Esta es una forma más intuitiva de acceder a las columnas en comparación con el acceso por índices:

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. Usar enumeraciones como encabezados

El uso de cadenas para acceder a los valores de las columnas puede ser propenso a errores. El uso de Enums en lugar de Strings hará que el código sea más estandarizado y más fácil de entender:

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. Saltarse la línea de encabezado

Por lo general, los archivos CSV contienen encabezados en la primera línea. Por lo tanto, en la mayoría de los casos, es seguro omitirlo y comenzar a leer desde la segunda fila.

Esto detectará automáticamente los valores de las columnas de acceso a los encabezados:

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

5.5. Crear un archivo con encabezados

Del mismo modo, podemos crear un archivo CSV con la primera línea que contiene los encabezados:

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

6. Conclusión

Presentamos el uso de la biblioteca CSV Commons de Apache a través de un ejemplo simple. Puede leer más sobre la biblioteca aquí.

El código de este artículo está disponible en Github.