Невозможно разобрать как целое число

Хорошо... У меня есть этот файл .txt (UTF-8)

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

И этот код

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

На эмуляторе все в порядке, но на реальном устройстве (HTC Desire) я получаю эту (странную) ошибку:

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

В чем проблема?

** это просто какой-то мой класс, которому нужны эти параметры в качестве входных данных (context,int,string,string,int,double)


person svenkapudija    schedule 04.01.2011    source источник


Ответы (4)


Возможно, ваш файл не UTF8 или что-то в этом роде.

Однако, если вы хотите взломать исправление, потому что вас не интересует проблема, а только решение :), тогда удалите все, что не является цифрой или десятичной точкой.

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

Регулярное выражение не идеально (например, оно повлияет на ...999....), но оно вам подойдет.

РЕДАКТИРОВАТЬ:

Я не прочитал вопрос должным образом, кажется. Если это только в начале файла, то очень вероятно, что у вас есть метка порядка байтов, которая используется, чтобы сказать вам, является ли файл юникодом, а также в UTF16/32, является ли он маленьким или большим порядок байтов Вам не нужно, как правило, использовать его очень часто.

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

person sksamuel    schedule 04.01.2011
comment
Да, это работает! :) Но почему он показывает только цифры «4661»? Где другая проблемная часть строки? - person svenkapudija; 05.01.2011
comment
Понятия не имею, не видя вашего файла. Скорее всего, исходный файл имеет нечетную кодировку или поврежден. - person sksamuel; 05.01.2011

Я собирался добавить это как комментарий, но решил также включить изображение. Кажется, проблема не в том, что файл не в UTF-8, а в том, что на самом деле верно обратное - кажется, что это UTF-8, но он не читается правильно.

Изображение из шестнадцатеричного редактора, просматривающего созданный мной файл UTF-8, содержащий первую строку. Обратите внимание на 3 символа перед 4661...

альтернативный текст

Если я сохраню файл в формате ANSI, этих символов там не будет.

person Squonk    schedule 04.01.2011

Вы можете использовать Notepad ++, открыть текстовый файл, выбрать меню «Кодировка» -> «Кодировка в UTF-8 без спецификации» и сохранить с этой опцией. Закодированные байты (EF BB BF) будут удалены, поэтому ваш код сможет без проблем преобразовать строку в целое число.

Надеюсь, это поможет.

person ThanhHH    schedule 07.05.2013

Я преобразовал файл для чтения в формат ascii, и он правильно читался в аналогичном приложении.

person Waleed Mohamed    schedule 20.08.2013