2011-01-04 15 views
7

porządku ... mam ten plik txt (UTF-8)Nie można analizować jako całkowitą

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

i ten kod

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

Na emulatora jest w porządku ale na rzeczywistym urządzeniu (HTC Desire) otrzymuję to (dziwne) błąd:

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

czym problem?

** to tylko niektóre moja klasa, która potrzebuje tych parametrów jako wejście (kontekst, int, string, string, int, double)

Odpowiedz

7

może to, że plik nie jest UTF8 lub coś wzdłuż tych linii.

Jednak jeśli chcesz zhackować poprawkę, ponieważ nie interesuje Cię problem, to po prostu rozwiązanie :), a następnie usuń wszystko, co nie jest cyfrą lub kropką dziesiętną.

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

Wyrażenie regularne nie jest idealne (na przykład ... 999 ... na przykład), ale zrobi to za Ciebie.

EDIT:

nie przeczytałem pytanie prawidłowo wydaje. Jeśli jest to tylko na początku pliku, bardzo prawdopodobne jest, że masz znak kolejności bajtów, który jest używany do informowania, czy plik jest w Unicode, a także w UTF16/32, czy jest to mały endian lub duży endian. Nie trzeba mieć tendencji do częstego używania.

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

+0

Tak, to działa! :) Ale dlaczego wyświetla tylko cyfry "4661"? Gdzie jest druga "problematyczna" część struny? – svenkapudija

+0

Nie mam pojęcia, nie widząc Twojego pliku. Prawdopodobnie oryginalny plik ma kodowanie nieparzyste lub jest uszkodzony. – monkjack

3

miałem zamiar dodać to jako komentarz, ale postanowił dołączyć obraz, jak również. Wydaje się, że problem nie polega na tym, że plik nie jest UTF-8, ale w rzeczywistości jest odwrotnie - wydaje się, że jest to UTF-8, ale nie jest poprawnie czytany.

Obraz pochodzi z edytora szesnastkowego, który przegląda utworzony przeze mnie plik UTF-8 zawierający pierwszą linię. Należy zwrócić uwagę na 3 znaki poprzedzające 4661 ...

alt text

Gdybym zapisać plik w formacie ANSI, te postacie nie istnieją.

1

Możesz użyć Notepad ++, otworzyć plik tekstowy, wybrać menu Kodowanie -> "Kodowanie w UTF-8 bez LM" i zapisać przy tej opcji. Zakodowane bajty (EF BB BF) zostaną usunięte, więc twój kod może parsować ciąg do liczby całkowitej bez żadnego problemu.

Mam nadzieję, że ta pomoc.

0

Przekonwertowałem plik do odczytu w formacie ASCII i został on poprawnie odczytany w podobnej aplikacji.

Powiązane problemy