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
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.