Lectura y escritura de CSV en Java con Apache Commons CSV

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *