Java - Convertir CSV (archivo de texto plano) a ArrayList

Java: convertir CSV (archivo de texto) a ArrayList

En el post te hoy te enseñaré a crear un ArrayList a partir de un archivo de texto plano en formato separado por comas usando Java.

Es decir, vamos a leer el archivo línea por línea, crear un objeto y luego agregar ese objeto al ArrayList. Básicamente vamos a convertir un txt o archivo separado por comas a un ArrayList.

Para este caso usaré la clase Persona que tiene los atributos nombre, edad y dirección.

El archivo es el siguiente:

Luis;40;Su casa
Link;20;Hyrule
Hollow Knight;5;Hallownest

Puedes tomarlo como convertir un CSV a ArrayList o un TXT a ArrayList.

Explicación del algoritmo

Convertir un CSV a ArrayList en Java es muy sencillo. Primero abrimos y recorremos el archivo línea por línea.

Después usamos split para convertir esa línea a arreglo, separándola por el punto y coma.

Para el ejemplo del archivo que coloqué al inicio, en la posición 0 del arreglo estaría el nombre, en la 1 la edad y en la 2 la dirección.

Ahora que tenemos un arreglo con los datos que necesitamos hacemos las conversiones de String a Int necesarias, creamos un objeto y luego lo agregamos al ArrayList.

CSV (archivo de texto) a ArrayList en Java

Java - Convertir CSV (archivo de texto plano) a ArrayList
Java – Convertir CSV (archivo de texto plano) a ArrayList

Primero veamos la clase. Recuerda que se supone que dentro del CSV hay un objeto por línea (serializado) y que vamos a crear varios objetos de este tipo:

class Persona {
	private String nombre, direccion;
	private int edad;

	public Persona(String nombre, int edad, String direccion) {
		this.nombre = nombre;
		this.edad = edad;
		this.direccion = direccion;
	}

	@Override
	public String toString() {
		return "Nombre: " + this.nombre + " edad: " + this.edad + ", direccion: " + this.direccion;
	}

	public String getNombre() {
		return this.nombre;
	}

	public String getDireccion() {
		return this.direccion;
	}

	public int getEdad() {
		return this.edad;
	}

}

Por el momento no coloqué setters ni más constructores, pues basta con lo que se ve en la clase para el ejercicio que vamos a resolver.

Creamos el ArrayList de tipo Persona que al inicio estará vacío y también abrimos el archivo manejando las excepciones:

final String NOMBRE_ARCHIVO = "personas.txt";
final String SEPARADOR_CAMPO = ";";
ArrayList<Persona> personas = new ArrayList<>();
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
  fileReader = new FileReader(NOMBRE_ARCHIVO);
  bufferedReader = new BufferedReader(fileReader);
  String linea;
}

Ahora hacemos un ciclo while leyendo el archivo línea por línea, y justo ahí ocurre la magia en donde agregamos el objeto al ArrayList con add:

while ((linea = bufferedReader.readLine()) != null) {
  String[] personaComoArreglo = linea.split(SEPARADOR_CAMPO);
  personas.add(new Persona(personaComoArreglo[0], Integer.valueOf(personaComoArreglo[1]),
      personaComoArreglo[2]));
}

La conversión también ocurre en la línea 3 en donde usamos Integer.valueOf. Finalmente regresamos ese ArrayList y así es como hemos transformado un txt a un ArrayList en Java.

Poniendo todo junto

El código completo junto con su uso queda como se ve a continuación. Recuerda que el orden del archivo TXT o CSV es importante y que el mismo debe existir:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

class Persona {
	private String nombre, direccion;
	private int edad;

	public Persona(String nombre, int edad, String direccion) {
		this.nombre = nombre;
		this.edad = edad;
		this.direccion = direccion;
	}

	@Override
	public String toString() {
		return "Nombre: " + this.nombre + " edad: " + this.edad + ", direccion: " + this.direccion;
	}

	public String getNombre() {
		return this.nombre;
	}

	public String getDireccion() {
		return this.direccion;
	}

	public int getEdad() {
		return this.edad;
	}

}

class Main {

	public static ArrayList<Persona> obtener() {
		final String NOMBRE_ARCHIVO = "personas.txt";
		final String SEPARADOR_CAMPO = ";";
		ArrayList<Persona> personas = new ArrayList<>();
		FileReader fileReader = null;
		BufferedReader bufferedReader = null;
		try {
			fileReader = new FileReader(NOMBRE_ARCHIVO);
			bufferedReader = new BufferedReader(fileReader);
			String linea;
			while ((linea = bufferedReader.readLine()) != null) {
				String[] personaComoArreglo = linea.split(SEPARADOR_CAMPO);
				personas.add(new Persona(personaComoArreglo[0], Integer.valueOf(personaComoArreglo[1]),
						personaComoArreglo[2]));
			}
		} catch (IOException e) {
			System.out.println("Excepción leyendo archivo: " + e.getMessage());
		} finally {
			try {
				if (fileReader != null) {
					fileReader.close();
				}
				if (bufferedReader != null) {
					bufferedReader.close();
				}
			} catch (IOException e) {
				System.out.println("Excepción cerrando: " + e.getMessage());
			}
			return personas;
		}
	}

	public static void main(String[] args) {
		ArrayList<Persona> personas = obtener();
		// Podemos imprimirlas...
		System.out.println(personas);
		// O recorrerlas
		for (int x = 0; x < personas.size(); x++) {
			Persona persona = personas.get(x);
			System.out.println("Tenemos una persona con nombre " + persona.getNombre() + " edad " + persona.getEdad()
					+ " y direccion " + persona.getDireccion());
		}

	}
}

En el main simplemente estoy obteniendo el ArrayList desde el archivo de texto plano y también recorriéndolo.

La salida ya la dejé en una imagen anteriormente. Es importante aclarar que esto es un ejemplo de una clase con 3 atributos pero que puedes ajustar para manejar más atributos o una clase distinta.

Para terminar te dejo con más tutoriales de Java en mi blog.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

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