Problemas con "puntos" o "comas"

milon
16 de Enero del 2005
Hola, resulta que acabo de darme cuenta que cuando leo el fichero de entrada para mi programa (datos numericos), si los numeros decimales estan escritos con "punto" (Ej. 12.56) va todo bien, pero si estan escritos con comas (Ej. 12,56) me cuenta como dos numeros, el 12.00 y el 0.56. No puedo cambiar los ficheros de entrada porque son muchisimos datos y porque el programa es para una empresa.
Utilizo lo siguiente para leer el fichero:

StreamTokenizer in = new StreamTokenizer(fichero);
while(in.nextToken() != StreamTokenizer.TT_EOF)
{
if(in.ttype == StreamTokenizer.TT_NUMBER)
{...}
...
}



Lemony Snicket
16 de Enero del 2005
Hola,...

Que no puedas cambiar los ficheros de entrada que genera la empresa no significa que no puedas formatear el contenido antes de procesarlo. Se me ocurren varias soluciones...

// Leemos el fichero de original.
FileReader frOriginal = new FileReader("original.txt");
BufferedReader brOriginal = new BufferedReader(frOriginal);

// Formateamos el contenido sustituyendo las comas por puntos y volcamos el resultado en un Reader que utilizará StreamTokenizer.
String linea = null;
StringBuffer contenidoFormateado = new StringBuffer();
while((linea = brOriginal.readLine())!=null){ contenidoFormateado.append(linea.replace(',','.'));
}

StringReader srFormateado= new StringReader(contenidoFormateado.toString());

// Procesamos el Reader generado (srFormateado) y por ejemplo sacamos el resultado en otro archivo
StreamTokenizer inFormateado = new StreamTokenizer(srFormateado);
FileOutputStream fout = new FileOutputStream("salida.txt");
PrintStream out = new PrintStream(fout);
while (inFormateado.ttype != inFormateado.TT_EOF) {
int token = inFormateado.nextToken();
if(token == inFormateado.TT_NUMBER){
out.println("Numero :" + inFormateado.nval);
}else if(token==inFormateado.TT_WORD){
out.println("Palabra :" + inFormateado.sval);
}

} // while

Otra opción menos eficiente sería por ejemplo generar un fichero intermedio con el contenido procesado y luego leer ese archivo y no el que te pasan como entrada. Para ello...

// Volcamos el contenido formateado en un fichero intermedio en lugar de volcar en srFormateado.
FileWriter fw = new FileWriter("intermedio.txt");
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
pw.println(contenidoFormateado.toString());
pw.close();


// Leemos el fichero intermedio con el contenido formateado
FileReader frFormateado = new FileReader("intermedio.txt");
StreamTokenizer inFormateado = new StreamTokenizer(frFormatedo);
.......
.......

Espero que te sirva.
Un saludo.

jrgarlok
16 de Enero del 2005
Otra solucion seria cambiar los delimitadores de StreamTokenizer porque por defecto te viene la coma.Ahora no me acuerdo como se hace pero en el api viene seguro. Un saludo

Lemony Snicket
16 de Enero del 2005
Hola,...

Supongo que te refieres al método StreamTokenizer.ordinaryChar(). Yo también lo pensé en un principio, pero luego caí en la cuenta de que usar ese método simplemente elimina el carácter ',' como separador de tokens pero no la sustituye por el punto, que sería lo conveniente en este caso, de modo que usando dicho método para el número 12,45 se devolvería 12.0 y 45.0.

Espero haber aclarado el tema algo más si cabe.

Un saludo.