Lectura y escritura de CSV en Java con OpenCSV

    Introducci贸n

    Este es el art铆culo final 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 Java con Apache Commons CSV.

    OpenCSV

    OpenCSV es uno de los analizadores CSV m谩s simples y f谩ciles de entender, que utiliza Reader/Writer clases y ofreciendo un CSVReader implementaci贸n en la parte superior.

    Al igual que Apache Commons CSV, OpenCSV opera con una licencia Apache 2.0. Antes de descargar y decidir si usar analizadores OpenCSVs, puede navegar por el c贸digo fuente y documentos Java, e incluso echa un vistazo a su conjunto de pruebas JUnit, que se incluye en su repositorio de git.

    OpenCSV tambi茅n se incluye en el MVNRepository, lo que simplifica la gesti贸n de la dependencia.

    los CSVReader permite buscar un solo registro a la vez, m煤ltiples registros como una lista o como un iterador, lo que lo hace flexible en t茅rminos de usabilidad de los datos le铆dos. La biblioteca tambi茅n incluye funciones 煤tiles como lectura, escritura hacia y desde beans y mapeo directo desde un CSV a un mapa de Java utilizando la fila de encabezado.

    OpenCSV no tiene una variedad tan amplia de formatos predefinidos como Apache Commons CSV. Se basa en dos analizadores:

    • CSVParser – El analizador original definido en OpenCSV. Esto funciona para la mayor铆a de las instancias de an谩lisis simple, pero falla si hay caracteres de escape definidos como parte del propio registro.
    • RFC4180Parser – Similar a CSVFormat.RFC4180 analizador en Apache Commons CSV. Funciona en archivos CSV que est谩n formateados de acuerdo con las especificaciones de RFC 4180. Esta versi贸n del analizador considera todos los caracteres entre las comillas de apertura y cierre como contenido, excepto el car谩cter de comilla doble, que debe escaparse con otra comilla doble.

    Lectura de CSV con OpenCSV

    Leer CSV con OpenCSV es m谩s r谩pido que con Apache Commons CSV porque el CSVWriter se implementa para ser multiproceso, cuando se utiliza el CSVToBean.parse() m茅todo.

    los CSVReader tambi茅n se implementa utilizando Java Iterable, por lo que es posible administrar las limitaciones de tiempo y de memoria seg煤n el m茅todo de implementaci贸n que elija.

    OpenCSV tiene dos tipos de objetos para leer CSV: CSVReader, y su subclase CSVReaderHeaderAware.

    CSVReader es similar a su Apache Commons CSV CSVParser contraparte y se puede utilizar para escenarios de an谩lisis sencillos y complicados.

    Para iterar a trav茅s de cada registro en un archivo CSV, donde record ser谩 una matriz de cadenas con los valores separados por comas divididos en campos individuales:

    CSVReader csvReader = new CSVReader (new InputStreamReader(csvFile.getInputStream()));
    while ((record = csvReader.readNext()) != null) {
        // do something
    }
    

    Si su CSV est谩 delimitado por un car谩cter que no sea una coma, puede usar el constructor de dos par谩metros en su lugar y especificar el delimitador que desea CSVReader usar.

    Por ejemplo, si su CSV contiene valores separados por tabulaciones, puede inicializar el CSVReader como sigue:

    CSVReader csvReader = new CSVReader(new InputStreamReader(csvFile.getInputStream()), 't');
    

    OpenCSV tambi茅n tiene una forma m谩s complicada de analizar archivos CSV que implica implementar beans para mapear los campos en un CSV y luego usar anotaciones para identificar los tipos de registros con anotaciones basadas en encabezados o basadas en posiciones.

    Esto ayuda porque permite que los registros de un CSV se procesen como un conjunto de datos com煤n, en lugar de como una colecci贸n de campos individuales.

    Si los nombres de encabezado del archivo que se est谩 procesando son consistentes, puede anotar las columnas usando el @CSVBindByName anotaci贸n y permitir que OpenCSV se encargue del lado de mapeo y copia del procesamiento de los datos analizados.

    Por ejemplo, con nuestro conjunto de datos de 谩rbol:

    public class Trees {
        @CSVBindByName
        private int index;
    
        @CSVBindByName
        private int girth;
    
        @CSVBindByName
        private int height;
    
        @CSVBindByName
        private int volume;
    
        public int getIndex() {
            return this.index;
        }
    
        public void setIndex(int newIndex) {
            this.index = newIndex;
        }
        ...
    }
    

    Siempre que su archivo CSV contenga un encabezado con los nombres de las variables en nuestra declaraci贸n de clase, OpenCSV puede analizar y leer datos en el elemento correspondiente, con conversiones de tipos manejadas autom谩ticamente:

    List<Trees> treeParser = new CSVToBeanBuilder(FileReader("somefile.csv")).withType(Trees.class).build().parse();
    

    Se pueden agregar validaciones a los m茅todos getter y setter cuando sea necesario, y los campos obligatorios se pueden especificar configurando el required bandera en la anotaci贸n.

    Si el nombre del encabezado es ligeramente diferente del nombre de la variable, la Cadena tambi茅n se puede establecer en la anotaci贸n. La capacidad de asignar el nombre del encabezado cuando el nombre de la columna es diferente es 煤til en nuestro ejemplo, ya que nuestro conjunto de datos actual contiene la unidad de medida del campo, junto con un espacio y caracteres de puntuaci贸n que no est谩n permitidos en los nombres de variables est谩ndar de Java.

    La bandera y el mapeo se pueden especificar con la anotaci贸n en este caso:

    ...
        @CSVBindByName (column = "Girth (in)", required = true)
        private int girth;
    ...
    

    Si su archivo CSV no tiene un encabezado, puede mapear por posici贸n de columna junto con el @CSVBindByPosition anotaci贸n.

    Tenga en cuenta que las posiciones de OpenCSV est谩n basadas en 0:

    public class Trees{
        @CSVBindByPosition(position = 0, required = true)
        private int index;
    
        @CSVBindByPosition(position = 1, required = true)
        private int girth;
    
        @CSVBindByPosition(position = 2)
        private int height;
    
        @CSVBindByPosition(position = 3)
        private int volume;
    }
    

    Si desea manejar escenarios m谩s complicados, puede implementar una clase con el Interfaz MappingStrategy y defina el esquema de traducci贸n o mapeo que se adapte a su escenario de an谩lisis.

    Escribir CSV con OpenCSV

    OpenCSV tiene m谩s opciones que Apache Commons CSV cuando se trata de escribir datos en archivos CSV. Le permite escribir desde una matriz de cadenas o desde una lista de objetos.

    Escribir desde una lista de objetos requiere que los objetos se inicialicen y declaren de antemano. Entonces, para simplificar las cosas, consideremos trabajar con una matriz de cadenas.

    Para generar un archivo CSV con datos de una matriz de cadenas:

    CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), ',');
    String[] records = "Index.Girth.Height.Volume".split(".");
    csvWriter.writeNext(records);
    csvWriter.close();
    

    OpenCSV trabaja con el concepto de que CSV no son solo valores separados por comas; le permite definir qu茅 delimitador desea utilizar en el archivo como par谩metro en el CSVWriter constructor.

    De manera similar, al definir una matriz de cadenas, puede resultarle 煤til declarar una cadena y luego separarla en valores basados 鈥嬧媏n un delimitador. Esto es especialmente 煤til cuando necesita copiar un subconjunto seleccionado de filas de datos de un archivo CSV o de base de datos a otro.

    Al inicializar el CSVWriter, la FileWriter o Writer es obligatorio. La inicializaci贸n del escritor con un solo par谩metro da como resultado un archivo separado por comas predeterminado.

    Hay algunos par谩metros adicionales para casos de uso espec铆ficos:

    • Char separator – el delimitador. Si no se declara, el delimitador predeterminado ser谩 una coma.
    • Char quotechar – el car谩cter de la cita. Esto se utilizar谩 en caso de que su conjunto de datos contenga un valor con una coma como parte del conjunto de datos y necesite generar un archivo separado por comas. Generalmente, se utilizan comillas dobles, comillas simples o barras inclinadas como caracteres de comillas.
    • Char escapechar – Esto se usa generalmente para escapar del quotechar.
    • String lineend – la cadena o car谩cter que determina el final de una l铆nea de datos.

    Podr铆as construir el CSVWriter incluyendo todos los par谩metros opcionales:

    CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), ",", "'","/", "n");
    

    CSVWriter tambi茅n tiene algunos campos que puede pasar como par谩metros al constructor. Puede definir estos valores como constantes y reutilizar los caracteres y cadenas en su base de c贸digo para preservar la coherencia.

    Por ejemplo, despu茅s de declarar:

    CSVWriter.DEFAULT_SEPARATOR = ",";
    CSVWriter.DEFAULT_QUOTE_CHARACTER = "'";
    CSVWriter.DEFAULT_ESCAPE_CHARACTER = "/";
    CSVWriter.DEFAULT_LINE_END = "n";
    

    Podr铆as usar:

    CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
    

    O haga uso de OpenCSV usando los valores predeterminados si los valores no est谩n definidos expl铆citamente en el constructor y simplemente llame:

    CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"));
    

    Por lo tanto, si sus datos incluyen una l铆nea con un nombre de usuario y una direcci贸n, por ejemplo: JohnDoe, 19/2, ABC Street, Someplace, el formato de cadena real en el que deber铆a estar es “JohnDoe”, “19 // 2 /, Calle ABC /, Alg煤n lugar “.

    Conclusi贸n

    OpenCSV es uno de los analizadores CSV m谩s simples y f谩ciles de comprender, que utiliza Reader/Writer clases y ofreciendo un CSVReader implementaci贸n en la parte superior.

     

    Etiquetas:

    Deja una respuesta

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