domingo, 26 de septiembre de 2010

Respuesta Clase Scanner Java 5.

Esta es la respuesta a un comentario realizado en el post sobre la clase Scanner de Java 5.
El comentario dice así:

Tengo un problema que no se como solucionar.... tengo un fichero de esta manera:

AU Gutierrez, M
Marin, C
Bonachea, J
AF Gutierrez, Mateo
Lucha, Pedro
Gutierrez, Francisco
TI Are talus flatiron sequences in Spain climate-controlled landforms?
SO ZEITSCHRIFT FUR GEOMORPHOLOGIE
LA English
DT Article

Cada empiece con 2 letras mayusculas es un campo, y quiero leerlo y que interprete que es un campo diferente, es decir AU un campo con sus autores: Gutierrez, marin y Bonachea, estos autores que los meta todos juntos en un string, y AU en otro.
Estoy intentando leyendolo linea por linea, luego separarlo por tokens, y concatenar, pero no me sale nada!!!

haber si me podeis ayudar,

un saludo,
Toño.

Ahora bien, para dar respuesta a esta duda, yo lo resolví de la siguiente manera:



import java.io.*;
import java.util.*;
import java.util.regex.*;

public class Autores {
public static void main(String[] args)
throws FileNotFoundException {
Scanner scaner = new Scanner(
new File("archivos/datos.txt"));
Pattern patron = Pattern.compile("[A-Z]{2}");
ArrayList resultado =
new ArrayList();
StringBuffer sb = new StringBuffer();
/* sb: Guarda los autores relacionados en una sola
cadena separados por punto y coma (;)*/
/* resultado: guarda los autores relacionado de
stringbuffer en registros distintos */
int nroLinea = 1;
do{
String linea = scaner.nextLine();
Matcher matcher = patron.matcher(linea);
boolean coincide = matcher.find();
if(coincide && nroLinea == 1){
sb = new StringBuffer();
sb.append(linea.substring(3));
}else if(coincide && nroLinea != 1){
resultado.add(sb.toString());
sb = new StringBuffer();
sb.append(linea.substring(3));

}else{
sb.append(";"+linea);
}
nroLinea++;
}while(scaner.hasNext());
resultado.add(sb.toString());
for(String cadena: resultado){
System.out.println(cadena);
}
}
}


Explico:
La clase Scanner recibe un Archivo que es el que voy a leer (hay que asegurarse que la ruta es le correcta ya sea relativa o absoluta), de no ser así se lanza una FileNotFoundException.

Lo primero que hago es recorrer las líneas de este archivo con el ciclo do-while externo. Utilizo ls expresiones regulares para ver si mi comienzo de línea contiene dos caracteres en mayúsculas ([A-Z]{2}), si coincide puede pasar dos cosas: que sea la primera línea o no; si es la primera línea sólo agrego la cadena a un stringbuffer que almacena todos los autores relacionados, si no, si coincide pero no es la primera línea, agrego todos los autores relacionados (stringbuffer)a una Coleccion ArrayList de string y luego creo uno nuevo para la nueva cadena, si no es ninguno de estos dos casos, entonces quiere decir que la lectura de la línea es un autor más por lo que procedo a agregarlo al stringbuffer.

Además la línea después del while externo resultado.add(sb.toString) se asegura de agregar el último registro después de hacer el recorrido del archivo.

Nota: La el metodo substring(3) devuelve una nueva cadena a partir del caracter número 3, haciendo el conteo a partir de cero(0).

Toño si tienes otra duda, no vaciles en preguntar. Hasta Luego.

3 comentarios:

Anónimo dijo...

VOY A PROBARLO AHORA MISMO!!

Os cuento haber que tal va la cosa,

Saludos,
Toño

Anónimo dijo...

Hola Kelvin,

Me ayudó mucho tu respuesta, he estado hoy programandolo (ya que ayer con la huelga general..), y hace lo que quiero que haga! pero como acabo de empezar con Java,estoy un poco pez, no sé como hacer el método que concatena cadenas, el toString, no sé que parámetros mandarle, seguro que es una tonteria pero haber si me puedes echar otro cable...

Saludos,

Toño

Kelvin dijo...

Saludos Toño:

Se puede concatenar cadenas (String) a través del signo mas (+), por ejemplo;

String cadena1 = "Hola ";
String cadena2 = "Mundo!";
String cadenaConcatenada = cadena1+cadena2;
System.out.print(cadenaConcatenada);

Se puede concatenar en una misma cadena,por ejemplo:

int i = 1;
String cadena ="";
while(i <= 10){
cadena += " iteracion "+i;
i++;
}
System.out.print(cadena);

Va agregando al final de la cadena la palabra iteracion y el número.

Para concatenar un StringBuffer se utiliza el método append de esa clase, tal como lo hace el ejemplo arriba. Este agrega al final de la cadena (String) que le pase como parámetro.
Espero haberme explicado y haya quedado, claro. Hasta Luego, Estamos a la orden