Bibliotecas para leer y escribir CSV en Java

CSV significa valores separados por comas, un método de formato de datos que se ha utilizado incluso antes de que se generalizara el uso de ordenadores personales. El formato...

Introducción

CSV significa Valores Separados por Comas, un método de formato de datos que se ha utilizado incluso antes de que se generalizara el uso de computadoras personales. El formato ganó popularidad porque las primeras computadoras usaban tarjetas perforadas para procesar datos, y los valores separados por comas son más fáciles de 'perforar' que el formato de tabla tradicional datos en columnas fijas.

En la actualidad, los archivos CSV se utilizan normalmente para transferir datos entre aplicaciones o sistemas, actuando como un formato común para exportar datos de un sistema e importarlos a otro.

El formato CSV generalmente consta de información organizada con líneas que consisten en múltiples campos separados por un delimitador, con una línea equivalente a un registro de datos. El delimitador puede ser una coma, un punto y coma o un tabulador. No hay un formato específico, aunque se introdujo una especificación denominada RFC 4180 en un intento de estandarizar el comportamiento ideal de un archivo CSV.

###RFC4180 {#rfc4180}

"RFC" significa Solicitud de comentarios, lo que significa que el documento solo pretende ser un conjunto de especificaciones o pautas comunes, y no reglas aceptadas.

Hay muchas desviaciones del formato especificado en la forma en que las aplicaciones modernas generan y leen los archivos CSV, pero la mayoría de los sistemas se adhieren a las pautas iniciales establecidas por RFC 4180.

Según RFC 4180, los archivos CSV deben tener los siguientes puntos en común:

  • Cada registro debe estar en una línea separada, con un carácter de salto al final de la línea.
  • Puede haber o no una línea de encabezado. La presencia de un encabezado se puede especificar en el parámetro header del Tipo de Mimica.
  • El tipo MIME para archivos CSV registrados oficialmente con IANA es "text/csv".
  • Cada registro puede constar de uno o más campos separados por comas, y la misma cantidad de campos debe persistir en todo el archivo (debe haber la misma cantidad de campos en todos los registros).
  • Si un campo contiene comas, saltos de línea o comillas dobles, debe estar entre comillas dobles.

Por qué usar CSV para operaciones de E/S con Java {#por quéusecsvsforiooperationswithjava}

Los archivos CSV son legibles por humanos y más simples de entender que otros formatos de transferencia de datos como XML o [JSON](/leer-y-escribir-json-en -Java/).

Los archivos CSV se pueden importar a la mayoría de las aplicaciones de hojas de cálculo como Excel, Google Sheets y OpenOffice Calc, y son fáciles de generar: un archivo .xls o .xlsx existente se puede convertir a formato CSV dentro de Excel mismo , siempre que el archivo contenga solo caracteres y no macros, imágenes, etc.

El formato es compacto y, por lo general, de menor tamaño, lo que permite un procesamiento y una generación más rápidos. En comparación, XML requiere repetición; normalmente, el nombre del encabezado de columna se repite dos veces para cada fila con las etiquetas de inicio y final (junto con los caracteres relacionados con la sintaxis), mientras que CSV solo requiere los encabezados de columna una vez, generalmente en la primera fila.

Teniendo en cuenta todos estos factores, poder leer y escribir en archivos CSV es una habilidad clave para cualquier desarrollador de Java.

Leer y escribir archivos CSV en Core Java

Debido a la popularidad y el uso generalizado de CSV como formato para la transferencia de datos, existen muchas bibliotecas de analizadores que se pueden usar junto con Java.

Los analizadores de terceros definen formatos comunes y pueden trabajar con varios delimitadores, manejar caracteres especiales y, a veces, incluso leer datos no binarios. Sin embargo, sigue siendo importante poder manejar archivos CSV con el núcleo de Java, sin el uso de bibliotecas adicionales.

Una simple combinación de FileReader, BufferedReader y String.split() puede facilitar la lectura de datos de archivos CSV.

Leer y escribir CSV con Apache Commons CSV

La biblioteca Apache Commons CSV es la versión de Apache Software Foundation de un analizador Java CSV. Según el resumen del proyecto, intenta "proporcionar una interfaz sencilla para leer y escribir archivos CSV de varios tipos ".

Como todas las bibliotecas asociadas con Apache, opera con una licencia apache, lo que significa que puede usarse, distribuirse y modificarse libremente.

Leer y escribir archivos CSV con OpenCSV {#leer y escribir csvswithopencsv}

OpenCSV es uno de los analizadores de CSV más simples y fáciles de entender, utiliza clases estándar Reader/Writer y ofrece una implementación CSVReader en la parte superior.

Al igual que Apache Commons CSV, OpenCSV funciona con una licencia Apache 2.0. Antes de descargar y decidir si usar los analizadores de OpenCSV, puede navegar por el código fuente y documentos de Java, e incluso consultar su conjunto de pruebas JUnit, que está incluido en su repositorio git.

Bibliotecas de terceros para operaciones CSV IO

Saber cómo leer y escribir en un archivo CSV en el núcleo de Java es importante y, por lo general, suficiente para la mayoría de las operaciones básicas. Sin embargo, hay casos en los que depender de una biblioteca de terceros es el camino a seguir.

Por ejemplo, nuestro propio uso de split para analizar un archivo CSV, sin usar las bibliotecas anteriores, fallaría si los campos mismos tuvieran comas. Podríamos ampliar nuestra lógica para adaptarnos a este escenario, pero ¿por qué reinventar la rueda cuando ya existen soluciones probadas disponibles para su uso?

Aquí es donde entran las bibliotecas: la mayoría de ellas admiten varias configuraciones e identifican los caracteres de escape y los caracteres de final de archivo que se usan con frecuencia en diferentes sistemas, conjuntos de productos y bases de datos para que no tengamos que rastrear, implementar y probar cada uno. configuración nosotros mismos.

Hay una multitud de diferentes bibliotecas de análisis disponibles de forma gratuita, cada una con diferentes puntos fuertes. Consideremos algunas de las bibliotecas más populares para el análisis de CSV con Java, comparando sus ventajas y desventajas.

Otras bibliotecas CSV

Además de Apache Commons CSV y OpenCSV, hay una variedad de otros analizadores de CSV disponibles para su uso. Echemos un vistazo rápido a algunas de las otras bibliotecas y comparar su uso, ventajas y desventajas:

Súper CSV

SuperCSV es otra biblioteca de análisis CSV dominante. La implementación de SuperCSV admite formatos que no son considerados por otros analizadores convencionales.

Similar a los métodos de anotación de OpenCSV, SuperCSV ofrece compatibilidad con POJO para tratar con Java Beans, además de las listas y mapas habituales.

La biblioteca también maneja la codificación y decodificación, siempre que el archivo cumpla con el formato descrito en [Especificación SuperCSV] (http://super-csv.github.io/super-csv/csv_specification.html). Si el archivo no es compatible, aún puede definir un delimitador personalizado, un carácter de comillas o un carácter de nueva línea según sea necesario, o ampliar el código fuente para facilitar requisitos específicos.

El análisis se facilita con las opciones de formato de datos disponibles con SuperCSV, que permite recortar y reemplazar expresiones regulares durante el procesamiento. La biblioteca también admite entrada y salida basadas en secuencias, lo que la hace manejable en términos de rendimiento y sistemas con limitaciones de memoria.

La biblioteca SuperCSV también permite la lectura parcial y la escritura parcial, lo que no es compatible con los otros analizadores CSV que hemos discutido a lo largo de este artículo. Puede elegir establecer valores de columna de encabezado específicos en null y continuar con el procesamiento de las columnas restantes, o escribir un conjunto de datos que contenga valores opcionales sin agregar su propio manejo de errores.

Un gran inconveniente que vale la pena mencionar es que la biblioteca no parece mantenerse -la última fecha publicada es hace cuatro años- en 2015, aunque el [repositorio git](https://github.com/super-csv/super- csv) tiene contribuciones más recientes.

Analizador CSV de UniVocity

Analizador CSV de UniVocity loudly afirma ser el analizador CSV más rápido en una comparación de 2018 entre 18 analizadores CSV diferentes disponibles públicamente. El analizador UniVocity le permite seleccionar los campos que desea analizar, omitiendo los campos innecesarios o no obligatorios en un solo archivo, dándole la capacidad de filtrar columnas de un CSV.

Tiene más opciones de personalización que OpenCSV y Apache Commons CSV, lo que hace que sea más difícil de configurar y comenzar. La legibilidad del código también puede ser menor en comparación con otras bibliotecas, ya que el analizador UniVocity requiere que se declare el formato, el separador de línea y el método de extracción del encabezado antes de intentar el análisis.

En el lado positivo, la variedad de opciones de formato y personalización lo hace adecuado para tratar los 'casos extremos' que involucran archivos CSV que no son compatibles con RFC4180.

Similar a OpenCSV y Apache Commons CSV, puede usar un iterador o una clase de analizador definida (en este caso, CsvParser o TsvParser). UniVocity CSV Parsers también admite la lectura en beans con una configuración más compleja en comparación con OpenCSV.

La escritura es un proceso igualmente complicado, pero configurable con el analizador UniVocity CSV, con casos de uso específicos como la capacidad de definir conversiones de valores y selección de columnas. También se admite la escritura directamente desde un mapa o Java Beans anotados.

Analizador CSV de FlatPack

Analizador CSV FlatPack es rápido y más adecuado para manejar archivos extremadamente grandes, lidiando con la clasificación de archivos antes del análisis y el análisis de ancho fijo. Se puede usar en un escenario donde su CSV no tiene un delimitador específico pero está compuesto por texto de ancho fijo, por ejemplo. El analizador también admite el mapeo de columnas a través de especificaciones XML, donde los campos en el XML y los campos de datos en el CSV están en el mismo orden.

BuffReaderDelimiterFactory permite transmitir archivos más grandes para evitar que todo esté contenido en la memoria al analizar los datos. Las columnas también se pueden agregar, eliminar o ignorar según sea necesario.

Dado que la biblioteca se enfoca en ser amigable para archivos más grandes, también permite la opción de excluir datos incorrectos y agregarlos a una colección de errores para su posterior procesamiento. Esto evita la necesidad de volver a procesar un conjunto de datos masivo debido a uno o dos errores y simplifica el manejo de errores.

La biblioteca está actualmente mantenida, con la publicación más reciente en 2019. Tiene fortalezas específicas, pero puede ser complicado de configurar y comprender debido a la multitud de opciones y funciones de personalización introducidas para manejar escenarios muy específicos que no son RFC4180 obediente.

Conclusión

Los escenarios de lectura y escritura de CSV más básicos se pueden manejar utilizando Java IO central con BufferedReaders, FileWriters y manejo de errores personalizado. Sin embargo, las bibliotecas externas brindan soluciones probadas cuando se trata de operaciones más complejas que implican poder admitir archivos más grandes que pueden o no ser compatibles con RFC 4180, con diferentes delimitadores y diferentes requisitos.

El rendimiento y la flexibilidad de su aplicación dependen de la opción que elija: algunos analizadores son mejores en la gestión de la memoria, mientras que otros son más flexibles y personalizables.

Puede usar este artículo como una guía para identificar qué biblioteca se adapta mejor a sus necesidades y aprender los conceptos básicos del manejo de archivos CSV y leer y escribir CSV en Java. Java.

Licensed under CC BY-NC-SA 4.0