Bibliotecas para leer y escribir archivos CSV en Java

    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.

     

    Etiquetas:

    Deja una respuesta

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