2011-01-04 17 views
7

bien ... Tengo este archivo .txt (UTF-8)No se puede analizar como un número entero

4661,SOMETHING,3858884120607,24,24.09 
4659,SOMETHING1,3858884120621,24,15.95 
4660,SOMETHING2,3858884120614,24,19.58 

Y este código

FileInputStream fis = new FileInputStream(new File(someTextFile.txt)); 
InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 
BufferedReader in = new BufferedReader(isr); 

int i = 0; 
String line; 
while((line = in.readLine()) != null) { 
Pattern p = Pattern.compile(","); 
String[] article = p.split(line); 

// I don't know why but when a first line starts with 
// an integer - article[0] (which in .txt file is 4661) 
// becomes someWeirdCharacter4661 so I need to trim it 
// *weird character is like |=>| 

if (i == 0) { 
    StringBuffer articleCode = new StringBuffer(article[0]); 
    articleCode.deleteCharAt(0); 
    article[0] = articleCode.toString(); 
} 

SomeArticle**.addOrChange(mContext, Integer.parseInt(article[0]), article[1], article[2], Integer.parseInt(article[3]), Double.parseDouble(article[4])); 

i++; 
} 

En emulador que está bien, pero en dispositivo real (HTC Desire) me sale esto (raro) error:

E/AndroidRuntime(16422): java.lang.NumberFormatException: unable to parse '4661' as integer 

Cuál es el problema?

** Es sólo algunas de mi clase que necesita esos parámetros como entrada (contexto, int, string, int, double)

Respuesta

7

Podría que el archivo no es UTF8 o algo por el estilo.

Sin embargo, si quiere hackear una solución porque no está interesado en el problema solo una solución :) entonces elimine todo lo que no sea un dígito o punto decimal.

String[] article = p.split(line); 
Integer i = Integer.parseInt(article[0].replaceAll("[^0-9.]","")); 

La expresión regular no es perfecta (afectaría ... 999 .... por ejemplo) pero lo hará por usted.

EDIT:

no he leído correctamente la pregunta que parece. Si solo está al principio del archivo, es muy probable que lo que tenga es una marca de orden de bytes, que se usa para indicarle si el archivo es unicode y también en UTF16/32, ya sea pequeño o grande. endian No necesita tender a ver que se usa con mucha frecuencia.

http://unicode.org/faq/utf_bom.html#bom10

+0

Sí, funciona! :) Pero, ¿por qué muestra solo los dígitos '4661'? ¿Dónde está la otra parte "problemática" de la cadena? – svenkapudija

+0

No tengo idea sin ver tu archivo. Es probable que su archivo original tenga una codificación extraña o esté dañado. – monkjack

3

que iba a añadir esto como un comentario, pero decidió incluir una imagen así. Parece que el problema no es que el archivo no sea UTF-8, sino que, en realidad, es todo lo contrario: parece que es UTF-8 pero no se lee correctamente.

La imagen es de un editor hexadecimal que mira un archivo UTF-8 que creé que contiene la primera línea. Tenga en cuenta los 3 personajes anteriores de 4661 ...

alt text

Si salvo el archivo en formato ANSI, los personajes no están allí.

1

Puede usar Notepad ++, abra su archivo de texto, elija el menú Codificación -> "Codificación en UTF-8 sin lista de materiales" y guárdelo con esta opción. Los bytes codificados (EF BB BF) se eliminarán, por lo que su código puede analizar cadena a entero sin ningún problema.

Espero que esta ayuda.

0

He convertido el archivo para leer en formato ascii, y se leyó correctamente en una aplicación similar.

Cuestiones relacionadas