Lectura y escritura de CSV en Java con OpenCSV

L

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 ​​en 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.

 

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