Lectura y escritura de CSV en Java con Apache Commons CSV

L

Introducción

Este es el segundo artículo de una serie corta dedicada a las bibliotecas para leer y escribir CSV en Java, y una continuación directa del artículo anterior: Lectura y escritura de CSV en Core Java.

Apache Commons CSV

los Apache Commons CSV library es la versión de Apache Software Foundation de un analizador Java CSV. De acuerdo con la resumen del proyecto, intenta “proporcionar una interfaz simple para leer y escribir archivos CSV de varios tipos”.

Como ocurre con todas las bibliotecas asociadas con Apache, opera con un Licencia Apache, lo que significa que se puede utilizar, distribuir y modificar libremente.

Apache Commons permite a los desarrolladores definir sus propios formatos, pero ofrece un conjunto predefinido de formatos con su Clase CSVFormat.

Estos formatos predefinidos son:

  • RFC4180 – formato separado por comas definido por RFC 4180.
  • DEFECTO – Similar al formato RFC4180, pero permite líneas vacías entre filas de datos. Este formato se utiliza si no se especifica lo contrario cuando define un analizador con la biblioteca CSV de Apache Commons.
  • SOBRESALIR – Similar a RFC 4180, pero permite que falten nombres de columna e ignora las líneas vacías.
  • TDF – Formato predefinido para archivos CSV que están delimitados con pestañas (t) en lugar de comas.
  • MYSQL – El formato soportado por MySql’s SELECT INTO OUTFILE y LOAD DATA INFILE operaciones.
  • ORÁCULO – Formato CSV utilizado por el cargador Oracle SQL.
  • INFORMIX_UNLOAD e INFORMIX_UNLOAD_CSV – formatos especializados definidos para su uso con el IBM Informix base de datos integrable.
  • MONGODB_CSV y MONGODB_TSV – Funciona con el álamo NoSQL MongoDB base de datos, para valores separados por comas y tabuladores respectivamente.
  • POSTGRESQL_CSV y POSTGRESQL_TEXT – Formato soportado por bases de datos PostgreSQL.

Si necesita una solución muy simple, Apache Commons CSV podría no ser adecuado. La implementación está diseñada para ofrecer la máxima flexibilidad, lo que hace que el código fuente equivalga a unas 30.000 líneas y resulte bastante complejo de entender en algunos casos.

Sin embargo, si necesita cubrir una amplia variedad de formatos, Apache Commons es una biblioteca confiable, bien mantenida y actualizada regularmente, con extensos documentos de Java y documentación para desarrolladores para ayudar a los principiantes.

Está incluido en el repositorio de Maven Central y no tiene dependencias externas.

Lectura de CSV con Apache Commons CSV

La biblioteca Apache Commons ofrece varios métodos para acceder a campos individuales en un archivo CSV. Si está trabajando con aplicaciones como Excel, es probable que su CSV con formato Excel tenga un encabezado.

Sin embargo, si está utilizando CSV como un conjunto de texto básico separado por comas, para transferir datos entre sistemas o para alimentar a otra aplicación de procesamiento, el archivo puede contener datos a partir de la primera fila, sin un encabezado. La biblioteca CSV de Apache Commons tiene en cuenta ambos escenarios.

Si su archivo CSV no contiene un encabezado, o si no está seguro de si lo tiene, puede usar el índice para acceder a un registro. Ya que CSVRecord implementa la interfaz iterable de Java, el índice está basado en 0, aunque los índices CSV, cuando se abren con Excel y la mayoría de las otras aplicaciones, comienzan con 1:

CSVParser csvParser = CSVFormat.DEFAULT.parse(new InputStreamReader(csvFile.getInputStream()));
for (CSVRecord record : csvParser) {
    String field_1 = record.get(0);
    String field_2 = record.get(1);
    ...
}

Si está seguro de que el archivo CSV que necesita analizar tiene un encabezado y conoce el formato del encabezado antes de procesarlo, puede usar la cadena de la columna del encabezado para buscar registros.

Consideremos un archivo CSV de muestra con datos de árbol, y llámelo ‘CSV de datos de árbol’ para referencia futura en este artículo:

Índice de circunferencia (pulg) Altura (pies) Volumen (pies)

18.37010,3

Para hacer referencia a cada fila de datos, podríamos usar la indexación como en el ejemplo anterior, o el encabezado de columna:

InputStreamReader input = new InputStreamReader(csvFile.getInputStream());
CSVParser csvParser = CSVFormat.EXCEL.withFirstRecordAsHeader().parse(input);
for (CSVRecord record : csvParser) {
    String field_1 = record.get("Index");
    String field_2 = record.get("Girth (in)");
    String field_3 = record.get("Height (ft)");
    String field_4 = record.get("Volume (ft)");
}

Si desea leer un archivo que no contiene una fila de encabezado, desea definir su propio encabezado o encuentra que la indexación es confusa, Apache Commons también permite la definición de un encabezado para analizar.

En lugar de utilizar el .withFirstRecordAsHeader() método al definir el formato del archivo CSV, puede definir un encabezado manualmente. Por ejemplo, si desea evitar referirse a las unidades de medida en el encabezado en nuestro archivo de datos de árbol, puede redefinir el encabezado para usar sus propios valores de cadena:

CSVParser csvParser = CSVFormat.REF4180.withHeader("Index", "Girth", "Height", "Volume");
for (CSVRecord record : csvParser) {
    String field_2 = record.get("Girth");
}

Si su archivo CSV contiene un encabezado, pero desea definir su propio encabezado y omitir la lectura del encabezado en el archivo, use .readNext() para omitir la primera fila:

CSVRecord header = csvParser.readNext();
// read the other rows in a loop as usual

También puede usar una enumeración para definir un encabezado si necesita usar su definición en múltiples clases como en este ejemplo:

public enum treeHeader {
    Index, Girth, Height, Volume
}
...
CSVParser csvParser = CSVFormat.DEFAULT.withHeader(treeHeader.class).parse(input);
// read rows

La biblioteca CSV de Apache Commons tiene algunos métodos adicionales para facilitar el análisis, que incluye:

  • .getRecordNumber() : devuelve el número asignado al registro en el archivo CSV.
  • .isConsistent() – se puede usar para el manejo de errores, devuelve Verdadero o Falso en función de si el tamaño del registro actual coincide con el tamaño de la fila del encabezado.
  • .size() – se puede utilizar para determinar el número de valores en el registro.
  • .toString() : devuelve el registro como una cadena. Útil cuando necesita almacenar toda la fila como una cadena para su posterior procesamiento, hash o comparación.

Escribir CSV con Apache Commons CSV

La biblioteca CSV de Apache Commons se centra principalmente en leer datos de archivos CSV. Cuando se trata de escribir, los métodos recomendados en el guía del usuario están bastante familiarizados con nuestra implementación central de Java.

Sin embargo, existen algunas funciones adicionales útiles, como la capacidad de definir un encabezado al imprimir e imprimir directamente desde un JDBC ResultSet objeto.

los CSVPrinter clase implementa el Flushable y Closeable interfaces, haciendo que su comportamiento sea similar a una extensión de un Java habitual Writer o StringWriter.

Por ejemplo, para generar nuestro CSV de datos de árbol:

CSVPrinter csvPrinter = new CSVPrinter(stringWriter, CSVFormat.DEFAULT.withHeader("Index", "Girth", "Height", "Volume"));
csvPrinter.printRecord("1", "8.3", "70", "10.3");
csvPrinter.flush();

El método .withHeader() acepta los valores de cadena del encabezado como parámetros.

Si desea generar un CSV sin un encabezado, simplemente puede usar new CSVPrinter(stringWriter, CSVFormat.DEFAULT);.

Si desea utilizar los encabezados de columna de un JDBC existente ResultSet para imprimir, Apache Commons CSV acepta un ResultSet como parámetro para su .withHeader() método:

CSVPrinter csvPrinter = CSVFormat.RFC4180.withHeader(treeDataResultSet).print(out);
csvPrinter.printRecords(treeDataResultSet);

Si el CSVFormat que usa permite líneas vacías, puede usar csvPrinter.println() para imprimir una línea en blanco entre las filas de datos.

Además de un ResultSet, la .printRecords() El método también puede trabajar con una matriz iterable o una colección de cadenas pasadas al método mediante varArgs.

Conclusión

Apache Commons CSV intenta proporcionar una interfaz simple para leer y escribir archivos CSV de varios tipos.

La implementación está diseñada para ofrecer la máxima flexibilidad, lo que hace que el código fuente sea bastante complejo de entender en algunos casos.

Sin embargo, si necesita cubrir una amplia variedad de formatos, Apache Commons es una biblioteca confiable, bien mantenida y actualizada regularmente, con extensos documentos de Java y documentación para desarrolladores para ayudar a los principiantes.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad