Невозможно проанализировать как целое число - PullRequest
7 голосов
/ 05 января 2011

Хорошо ... У меня есть этот .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)

Ответы [ 4 ]

7 голосов
/ 05 января 2011

Возможно, ваш файл не 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

3 голосов
/ 05 января 2011

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

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

alt text

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

1 голос
/ 07 мая 2013

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

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

0 голосов
/ 21 августа 2013

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

...