Lectura y escritura de CSV en Java con Apache Commons CSV

Introducción

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

Apache Commons CSV

La biblioteca de Apache Commons CSV es la versión de Apache Software Foundation de un analizador de Java CSV. De acuerdo con el resumen del proyecto , intenta " proporcionar una interfaz simple para leer y escribir archivos CSV de varios tipos ".
Al igual que con todas las bibliotecas asociadas con Apache, opera con una licencia de Apache , lo que significa que se puede usar, 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.
  • POR DEFECTO : similar al formato RFC4180, pero permite líneas vacías entre las filas de datos. Este formato se usa si no se especifica lo contrario al definir un analizador con la biblioteca CSV de Apache Commons.
  • EXCEL : es 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 se delimitan con tabs ( \t) en lugar de comas.
  • MYSQL - El formato soportado por MySQL SELECT INTO OUTFILELOAD DATA INFILEoperaciones.
  • ORACLE : formato CSV utilizado por el cargador de Oracle SQL.
  • INFORMIX_UNLOAD e INFORMIX_UNLOAD_CSV : formatos especializados definidos para su uso con la base de datos de IBM Informix integrable.
  • MONGODB_CSV y MONGODB_TSV - Funciona con la base de datos NoSQL MongoDB del álamo , para valores separados por comas y separados por tabulaciones, respectivamente.
  • POSTGRESQL_CSV y POSTGRESQL_TEXT - Formato compatible con las 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 sea equivalente a unas 30,000 líneas y, en algunos casos, resulta bastante complejo de entender.
Sin embargo, si necesita cubrir una amplia variedad de formatos, Apache Commons es una biblioteca confiable, bien mantenida y actualizada regularmente, con una amplia documentación de Java Docs y de desarrolladores para apoyar a los principiantes.
Se incluye en el repositorio de Maven Central y no tiene dependencias externas.

Leyendo CSVs con Apache Commons CSV

La biblioteca de 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 básico de texto separado por comas, para transferir datos entre sistemas o para ingresar a otra aplicación de procesamiento, el archivo puede contener datos desde la primera fila, sin encabezado. La biblioteca de Apache Commons CSV toma en consideración estos dos escenarios.
Si su archivo CSV no contiene un encabezado, o si no está seguro de si lo contiene, puede usar el índice para acceder a un registro. Dado que CSVRecordimplementa 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 demás 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 recuperar los registros.
Consideremos un archivo CSV de muestra con datos de árbol y llamémoslo 'CSV de datos de árbol' para futuras referencias en este artículo:
ÍndiceCincha (en)Altura en pies)Volumen (ft)
18.37010.3
Para referirnos a cada fila de datos, podemos usar la indexación como en el ejemplo anterior, o el encabezado de la 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 encontrar un índice de confusión confuso, Apache Commons también permite la definición de un encabezado para el análisis.
En lugar de utilizar el .withFirstRecordAsHeader()método para 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 varias 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, entre ellos:
  • .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 según si el tamaño del registro actual coincide con el tamaño de la fila del encabezado.
  • .size() - Se puede usar para determinar el número de valores en el registro.
  • .toString()- Devuelve el registro como una cadena. Es útil cuando necesita almacenar toda la fila como una Cadena para su posterior procesamiento, hash o comparación.

Escribiendo CSVs con Apache Commons CSV

La biblioteca de Apache Commons CSV se centra principalmente en la lectura de datos de archivos CSV. Cuando se trata de escribir, los métodos recomendados en la guía del usuario son muy familiares para nuestra implementación central de Java.
Sin embargo, hay algunas características adicionales útiles, como la capacidad de definir un encabezado al imprimir e imprimir directamente desde un ResultSetobjeto JDBC .
La CSVPrinterclase implementa las interfaces FlushableCloseable, haciendo que su comportamiento sea similar a una extensión de un Java habitual WriterStringWriter.
Por ejemplo para generar nuestros datos de árbol CSV:
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 utilizarlo new CSVPrinter(stringWriter, CSVFormat.DEFAULT);.
Si desea utilizar los encabezados de columna de un JDBC existente ResultSetpara imprimir, Apache Commons CSV acepta ResultSetcomo parámetro para su .withHeader()método:
CSVPrinter csvPrinter = CSVFormat.RFC4180.withHeader(treeDataResultSet).print(out);  
csvPrinter.printRecords(treeDataResultSet);  
Si el CSVFormatuso permite líneas vacías, puede usar csvPrinter.println()para imprimir una línea en blanco entre las filas de datos.
Además de a ResultSet, el .printRecords()método también puede trabajar con una matriz de Iterable , o una colección de cadenas pasadas al método utilizando 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 una amplia documentación de Java Docs y de desarrolladores para apoyar a los principiantes.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.