Bibliotecas para leer y escribir archivos CSV en Java

B

Introducción

CSV representa Valores Separados por Comas, un método de formateo de datos que se ha utilizado incluso antes de que se generalizara el uso de ordenadores personales. El formato ganó popularidad porque las primeras computadoras usaron tarjetas perforadas para procesar datos, y los valores separados por comas son más fáciles de “introducir” que los datos tradicionales con formato de tabla 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 de nuevo a otro.

El formato CSV generalmente consiste en información organizada con líneas que constan de 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 carácter de tabulación. No hay un formato específico, aunque una especificación llamada RFC 4180 se ha introducido en un intento de estandarizar cómo debería comportarse idealmente un archivo CSV.

RFC 4180

“RFC” significa Solicitud de comentarios, lo que significa que el documento está destinado a 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 salto de carácter al final de la línea.
  • Puede que haya o no una línea de encabezado. La presencia de un encabezado se puede especificar en el header parámetro de la Tipo de Mimica.
  • El tipo MIME para archivos CSV registrados oficialmente con IANA es “texto / csv”.
  • Cada registro puede constar de uno o más campos separados por comas, y el mismo número de campos debe persistir en todo el archivo (debe haber el mismo número de campos en todos los registros).
  • Si un campo contiene comas, saltos de línea o comillas dobles, debe incluirse entre comillas dobles.

Por qué utilizar CSV para operaciones IO con Java

Los archivos CSV son legibles por humanos y más fáciles de entender que otros formatos de transferencia de datos como XML o JSON.

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 existente .xls o .xlsx El archivo se puede convertir a formato CSV dentro de Excel, siempre que el archivo contenga solo caracteres y no macros, imágenes, etc.

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

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

Lectura y escritura de 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, BufferedReadery String.split() puede facilitar la lectura de datos de CSV.

  • Leer y escribir archivos CSV en Java

Leer y escribir archivos CSV con 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.

  • Lectura y escritura de CSV en Java con Apache Commons CSV

Leer y escribir archivos CSV con 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.

  • Lectura y escritura de CSV en Java con OpenCSV

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 confiar en una biblioteca de terceros es el camino a seguir.

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

Aquí es donde entran en juego 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 utilizan con frecuencia en diferentes sistemas, conjuntos de productos y bases de datos para que no tengamos que realizar un seguimiento, implementar y probar cada configuración. Nosotros mismos.

Hay una multitud de bibliotecas de análisis diferentes 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 pros y contras.

Otras bibliotecas CSV

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

SuperCSV

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

De forma similar a los métodos de anotación de OpenCSV, SuperCSV ofrece soporte POJO para manejar 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 sea compatible con el formato descrito en la Especificación SuperCSV. Si el archivo no es compatible, aún puede definir un delimitador personalizado, un carácter de cita 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 basada en flujo, lo que la hace manejable en términos de rendimiento y sistemas con restricciones 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 optar por establecer valores de columna de encabezado específicos para null y proceda con el procesamiento de las columnas restantes, o escriba un conjunto de datos que contenga valores opcionales sin agregar su propio manejo de errores.

Un gran inconveniente que merece mencionarse es que la biblioteca no parece mantenerse -la última fecha de publicación es hace cuatro años- en 2015, aunque el repositorio de git tiene contribuciones más recientes.

Analizador CSV de UniVocity

Analizador CSV de UniVocity ruidosamente 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, lo que le da 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 algunas otras bibliotecas, ya que el analizador de UniVocity requiere que se declare el formato, el separador de línea y el método de extracción de encabezado antes de intentar el análisis.

En el lado positivo, la variedad de opciones de formato y personalización lo hace adecuado para lidiar con los ‘casos extremos’ que involucran archivos CSV que no cumplen 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.

Escribir 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 valor y selección de columnas. También se admite la escritura directamente desde un mapa o Java Beans anotados.

Analizador CSV FlatPack

Analizador CSV FlatPack es rápido y más adecuado para manejar archivos extremadamente grandes, lidiar con la clasificación de archivos antes del análisis y el análisis de ancho fijo. Se puede utilizar en un escenario en el que su CSV no tiene un delimitador específico, pero se compone de 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 XML y los campos de datos en CSV están en el mismo orden.

los BuffReaderDelimiterFactory permite la transmisión de 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 se mantiene actualmente, y la publicación más reciente es en 2019. Tiene fortalezas específicas, pero puede ser complicado de configurar y comprender debido a la multitud de opciones y características de personalización introducidas para manejar escenarios muy específicos que no cumplen con RFC4180.

Conclusión

Los escenarios de escritura y lectura 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 y comprobadas cuando se trata de operaciones más complejas que implican poder admitir archivos más grandes que pueden o no cumplir con RFC 4180, con delimitadores variables y requisitos diferentes.

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

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

 

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 y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. 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