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 *