Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Lectura y escritura de CSV en Java con OpenCSV

Introducción

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

OpenCSV

OpenCSV es uno de los analizadores de CSV más sencillos y fáciles de entender, utilizando estándares ReaderWriterclases y ofreciendo una CSVReaderimplementació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 los analizadores OpenCSVs, puede navegar a través del código fuente y los documentos Java , e incluso revisar su conjunto de pruebas JUnit, que se incluye en su repositorio git.
OpenCSV también se incluye en MVNRepository , lo que facilita la administración de dependencias.
El CSVReaderpermite ir a buscar un único registro a la vez, varios registros como una lista o como un repetidor, por lo que es flexible en términos de facilidad de uso de los datos leídos. La biblioteca también incluye funciones prácticas como la lectura, la escritura hacia y desde los beans y la asignación directa desde un CSV a un mapa Java utilizando la fila del 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 simples, pero falla si hay caracteres de escape definidos como parte del propio registro.
  • RFC4180Parser : similar al CSVFormat.RFC4180analizador 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 de cierre como contenido, excepto el carácter de comillas dobles, que debe eliminarse con otra comilla doble.

Leyendo CSVs con OpenCSV

La lectura de CSV con OpenCSV es más rápida que con Apache Commons CSV porque CSVWriterse implementa para ser multihebra cuando se usa el CSVToBean.parse()método.
El CSVReadertambién se implementa utilizando Java Iterable , por lo que es posible gestionar tanto las limitaciones de memoria y el tiempo basado en el método de aplicación que elija.
OpenCSV tiene dos tipos de objetos para leer CSVs - CSVReader y su subclase CSVReaderHeaderAware .
CSVReaderes similar a su CSVParserhomólogo de Apache Commons CSV y se puede usar para escenarios de análisis simples y complicados.
Para iterar a través de cada registro en un archivo CSV, donde recordhabrá 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 CSVReaderque use.
Por ejemplo, si su CSV contiene valores separados por tabulaciones, puede inicializar lo CSVReadersiguiente:
CSVReader csvReader = new CSVReader(new InputStreamReader(csvFile.getInputStream()), '\t');  
OpenCSV también tiene una forma más complicada de analizar los archivos CSV que implica implementar beans para asignar los campos en un CSV y luego usar anotaciones para identificar los tipos de registros con anotaciones basadas en encabezado o basadas en posición.
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 procesa son consistentes, puede anotar las columnas usando la @CSVBindByNameanotación y permitir que OpenCSV se encargue de la parte de la asignación 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 las conversiones de tipo que se manejan automáticamente:
List<Trees> treeParser = new CSVToBeanBuilder(FileReader("somefile.csv")).withType(Trees.class).build().parse();  
Las validaciones se pueden agregar a los métodos de obtención y establecimiento cuando sea necesario, y los campos obligatorios se pueden especificar al establecer la requiredmarca 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 real 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 la asignación 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 asignar por posición de columna junto con la @CSVBindByPositionanotació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 la Interfaz MappingStrategy y definir el esquema de traducción o mapeo que se adapte a su escenario de análisis.

Escribiendo CSVs 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 escribir desde una lista de objetos.
Escribir desde una lista de objetos requiere que los objetos se inicialicen y declaren de antemano. Así que para mantener las cosas simples, consideremos trabajar con una serie 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 funciona con el concepto de que CSV no es solo valores separados por comas; le permite definir qué delimitador desea utilizar en el archivo como parámetro en el CSVWriterconstructor.
De forma 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, el FileWriterWriteres obligatorio. Al inicializar el escritor utilizando solo un parámetro, se obtiene 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 usará en caso de que su conjunto de datos contenga un valor con una coma como parte del conjunto de datos, y usted necesite generar un archivo separado por comas. En general, se utilizan comillas dobles, comillas simples o barras inclinadas.
  • Char escapechar- Esto se usa generalmente para escapar de la quotechar.
  • String lineend - la cadena o el carácter que determina el final de una línea de datos.
Podrías construir el CSVWriterincluyendo todos los parámetros opcionales:
CSVWriter csvWriter = new CSVWriter(new FileWriter("new.csv"), ",", "'","/", "\n");  
CSVWriterTambié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"));  
Entonces, 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 necesitaría estar es "JohnDoe", "19 // 2 /, ABC Street /, En algún lugar " .

Conclusión

OpenCSV es uno de los analizadores de CSV más sencillos y fáciles de entender, utilizando estándares ReaderWriterclases y ofreciendo una CSVReaderimplementación en la parte superior.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas