Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Obtener datos de un txt

A ver, tengo una duda con un programa que estoy intentando hacer en java, y no consigo solucionarlo por más que le de vueltas, mi duda es que tengo que cargar un archivo de texto externo, en el cual hay diferentes palabras y valores, algo así:

Aliados:2
Enemigos:3
A;Pedro;12;1;3
E;Pepe;14;13;Sevilla;1
A;Pablo;18;11;3
E;Lolo;28;35;Madrid;1
E;Fernando;24;6;Barcelona;0


El archivo lo he cargado así:

try {
BufferedReader lector = new BufferedReader(new FileReader("archivo1.txt"));

String linea = lector.readLine();
while (linea != null) {
System.out.println(linea);
linea = reader.readLine();
}

reader.close();
} catch (Exception e) {
System.out.println("Error de lectura");
}

Así cargo el archivo y lo leo línea por línea, hasta ahí bien. Ahora lo que quiero conseguir es que los datos se vayan almacenando en diferentes variables, pero por ejemplo, la primera parte en la que pone "Aliados: 2", "Enemigos: 3", quiero que solo se almacene el número y se salte las palabras Aliados: y Enemigos:. Los siguientes datos que aparecen quiero almacenarlo en diferentes variables, por ejemplo:

E;Pepe;14;13;Sevilla;1

La E indicaría que el objeto es un enemigo, Pepe sería la string del nombre, 14 sería un atributo de dicho objeto, 13 otro, Sevilla la string de la ciudad y 1 otro atributo... o sea, que los ";" no cuenten y se almacene en ese orden.

Lo he intentado con StringTokenizer, pero no lo consigo entender correctamente. Sería de mucha ayuda si alguien me pudiese explicar cómo he de hacerlo. Muchas gracias de antemano.

mayo 12, 2015 | Unregistered CommenterSilent

El problemilla que veo es que el delimitador es diferente para las dos primeras líneas que para el resto. En las dos primeras, el delimitador es ":", mientras que en el resto sería ";".

Si puedes estar seguro de que las dos primeras líneas siempre informarán sobre cuántos aliados y enemigos hay y el resto sobre cada elemento individual, podrías llevar un contador en el bucle que estás usando, de modo que con un "if (contador < 2) { procesaTotales(linea);} else { procesaElemento(linea); }" trates cada cosa.

En cuanto a StringTokenizer, solo tienes que crearlo así (te pongo el ejemplo para la línea de elementos):


StringTokenizer st = new StringTokenizer(linea, ";");
String[] data = new String[6];
int i = 0;
while (st.hasMoreTokens()) {
data[i] = st.nextToken();
i++;
}
Contendiente c = new Contendiente();
c.setBando(data[0]);
c.setNombre(data[1]);
c.setAtrib1(data[2]);
c.setAtrib2(data[3]);

try {
int i = Integer.parseInt(data[4]);
c.setAtrib3(data[4]);
} catch (NumberFormatException e) {
// No hemos podido convertir el número porque es una ciudad
c.setCiudad(data[4]);
c.setAtrib3(data[5]);
}

mayo 12, 2015 | Registered Commenterrickiees

Tienes razón, puede hacerlo como le dices, pero además, el StringTokenizer permite como segundo parámetro una cadena con los delimitadores, con lo que si en el segundo parámetro del constructor del StringTokenizer pone ";:" tu método le valdrá también para la primera y segunda líneas, sólo que en esas dos debería tomar los dos primeros tokens como datos válidos.

mayo 13, 2015 | Registered Commentermanolonazareno