Leer y escribir CSV en Java

Este es el primer artículo de una breve serie dedicada a las bibliotecas para leer y escribir archivos CSV en Java. Lectura y escritura de archivos CSV en Core Java Propiedad de la p...

Introducción

This is the first article in a short series dedicated to Bibliotecas para leer y escribir CSV en 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, no todos los programas requieren todas esas funciones, por lo que 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. Consideremos los pasos para abrir un archivo CSV básico y analizar los datos que contiene:

  • Use FileReader para abrir el archivo CSV
  • Crear un BufferedReader y leer el archivo línea por línea hasta un "Fin de archivo" ([fin de semana]( https: //en.wikipedia.org/wiki/End-of-file)) se alcanza el carácter
  • Use el método String.split() para identificar el delimitador de coma y dividir la fila en campos
1
2
3
4
5
6
BufferedReader csvReader = new BufferedReader(new FileReader(pathToCsv));
while ((row = csvReader.readLine()) != null) {
    String[] data = row.split(",");
    // do something with the data
}
csvReader.close();

La matriz de cadenas data contendrá una lista de los campos en cada fila del archivo que se encuentra en la ubicación del archivo pathToCsv. Si el archivo CSV tiene un delimitador que no sea una coma, se puede especificar en el método split. Por ejemplo, otro delimitador común es la pestaña para archivos de valores separados por tabulaciones (TSV).

Los datos se pueden pasar a un método separado para su procesamiento o escritura en una base de datos desde dentro del bucle, o se pueden almacenar en una Colección Java para su uso posterior. Por ejemplo, si está escribiendo una gran cantidad de datos en una base de datos, las infracciones de restricciones (como infracciones de clave principal, por ejemplo) provocadas por errores humanos al generar el CSV pueden evitarse mediante el uso de un mapa hash. Si hay una entrada duplicada en el CSV, el mapa hash almacenará la 'lectura' más reciente y sobrescribirá la entrada anterior.

Dado que está escribiendo el analizador desde cero, deberá encargarse del manejo simple de errores por su cuenta. Por ejemplo, si no está seguro de si el archivo existe, siempre es más seguro encerrar la operación de lectura dentro de un bloque try/catch o agregar lógica para determinar la existencia del archivo antes de procesarlo.

Para comprobar si el archivo existe, se puede realizar la siguiente modificación en nuestro código:

1
2
3
4
File csvFile = new File(pathToCsv);
if (csvFile.isFile()) {
    // create BufferedReader and read data from csv
}

Con un manejo de errores simple y requisitos estrictos en el formato CSV, la mayoría de los programadores pueden realizar la creación de un analizador simple usando los componentes básicos de Java.

Escritura de archivos CSV en Core Java

La mayoría de los analizadores de terceros también admiten la escritura en archivos CSV. Sin embargo, existe una forma sencilla de escribir en archivos CSV, como cualquier otro tipo de archivo, sin utilizar bibliotecas.

La forma más sencilla es usar un objeto FileWriter y tratar el archivo CSV como cualquier otro archivo de texto. En nuestro ejemplo, los datos se almacenan en algunos objetos List, que simplemente iteramos y agregamos al escritor:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Our example data
List<List<String>> rows = Arrays.asList(
    Arrays.asList("Jean", "author", "Java"),
    Arrays.asList("David", "editor", "Python"),
    Arrays.asList("Scott", "editor", "Node.js")
);

FileWriter csvWriter = new FileWriter("new.csv");
csvWriter.append("Name");
csvWriter.append(",");
csvWriter.append("Role");
csvWriter.append(",");
csvWriter.append("Topic");
csvWriter.append("\n");

for (List<String> rowData : rows) {
    csvWriter.append(String.join(",", rowData));
    csvWriter.append("\n");
}

csvWriter.flush();
csvWriter.close();

Cuando use un FileWriter siempre asegúrese de vaciar y cerrar la transmisión. Esto mejora el rendimiento de la operación de E/S e indica que no hay más datos para escribir en el flujo de salida.

Conclusión

Hay varias formas de leer y escribir archivos CSV en Java, la más simple es usar componentes Core Java. Aunque esto también lo deja más vulnerable a los errores y será menos sólido que una solución comprobada de terceros.

Si está interesado en leer sobre otras formas de leer y escribir archivos CSV en Java, asegúrese de consultar nuestros otros artículos:

Licensed under CC BY-NC-SA 4.0