2011-01-04 11 views
7

Va bene ... Ho questo file .txt (UTF-8)Impossibile analizzare come intero

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

E questo codice

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++; 
} 

Su emulatore va bene ma il vero e proprio dispositivo (HTC Desire) ottengo questo (strano) di errore:

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

Qual è il problema?

** è solo un po 'la mia classe che ha bisogno di quei parametri come input (contesto, int, string, string, int, double)

risposta

7

Potrebbe che il file non è UTF8 o qualcosa del genere.

Tuttavia, se si desidera modificare una correzione perché non si è interessati al problema, solo una soluzione :), quindi rimuovere tutto ciò che non è una cifra o un punto decimale.

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

L'espressione regolare non è perfetto (sarebbe interessare ... 999 .... per esempio), ma lo farà per voi.

EDIT:

non ho letto la questione correttamente sembra. Se è solo all'inizio del file, è molto probabile che quello che hai sia un segno di ordine dei byte, che viene usato per dirti se il file è unicode e anche in UTF16/32 se è little endian o grande endian. Non hai bisogno di vederlo usato molto spesso.

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

+0

Sì, funziona! :) Ma perché mostra solo le cifre '4661'? Dov'è l'altra parte "problematica" della stringa? – svenkapudija

+0

Nessuna idea senza vedere il tuo file. È probabile che il tuo file originale abbia una codifica dispari o che sia corrotto. – monkjack

3

Stavo per aggiungere questo come un commento, ma ha deciso di includere un'immagine pure. Sembra che il problema non sia che il file non è UTF-8, ma in realtà è vero il contrario - sembra che sia UTF-8 ma non viene letto correttamente.

L'immagine proviene da un editor esadecimale che esamina un file UTF-8 che ho creato contenente la prima riga. Notare i 3 caratteri che precedono 4661 ...

alt text

Se salvo il file in formato ANSI, quei personaggi non ci sono.

1

È possibile utilizzare Notepad ++, aprire il file di testo, selezionare il menu Codifica -> "Codifica in UTF-8 senza BOM" e salvare con questa opzione. I byte codificati (EF BB BF) verranno rimossi, quindi il tuo codice può analizzare la stringa in intero senza alcun problema.

Spero che questo aiuto.

0

Ho convertito il file in formato ASCII e l'ho letto correttamente in un'applicazione simile.