Я столкнулся со следующей проблемой при попытке прочитать числа из файла csv. Цифры составлены правильно, десятичные точки тоже правильные (точки):
10;111.1;0.94
9.5;111.1;0.94
9;111.4;0.94
8.5;110.7;0.94
Я читаю файл построчно и разбиваю каждый из них на три токена, без пробелов и т. д. (Например, «10», «111,1», «0,94»). Несмотря на это, я получил исключение при вызове функции синтаксического анализа:
Double pwr = Double.parseDouble(tokens[1]);
Double control = Double.parseDouble(tokens[0]);
Double cos = Double.parseDouble(tokens[2]);
java.lang.NumberFormatException: For input string: "10"
Когда я меняю порядок строк, например, 1 <--> 2, проблема сохраняется, но теперь у меня java.lang.NumberFormatException: For input string: "9.5"
Что интересно, каждый раз, когда я делаю вышеуказанные вызовы с уровня отладчика, я получаю правильные значения без исключения. Похоже, проблема связана с первой строкой файла.
Вы хоть представляете, где находится источник проблемы?
да, вы должны опубликовать свой массив чисел, как в коде
Итерация по массиву символов токенов. Может быть, вы найдете неожиданного персонажа.
Вероятная проблема с кодировкой. Перед числами стоит невидимый символ. fileformat.info/info/unicode/char/200B/index.htm
Вероятно, у вас в начале строки стоит символ unicode. Просто чтобы убедиться, что вы можете распечатать строку как есть и скопировать вывод в строковую переменную в своем коде, вы сможете увидеть, какой это символ.
Выполните это с помощью отладчика, чтобы вы могли видеть фактические символы, составляющие каждый String, который вы пытаетесь проанализировать.




Вероятно, это непечатаемый символ ASCII
Чтобы удалить это, вы можете просто использовать метод replaceAll, подобный этому, и использовать следующее регулярное выражение для удаления\\P{Print}
BufferedReader br = new BufferedReader(new FileReader(""));
String str=br.readLine();
str=str.replaceAll("\\P{Print}", "");
После запуска следующего регулярного выражения вы сможете проанализировать значение
================================================== =========================
Чтобы узнать, что это за персонаж, вы можете попробовать это.
1) Прочтите строку и распечатайте ее так, как она есть.
public class Test {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader("/path/to/some.csv"));
String str=br.readLine();
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
}
ВЫХОД:
2) Теперь скопируйте вывод как есть и вставьте его в "" (двойные кавычки)
Как видите, теперь виден специальный символ.
[Решено] Предположительно проблема заключалась в каком-то «скрытом» символе нулевой длины в начале файла (кстати, спасибо за полезные предложения!). Я изменил кодировку файла на UTF-8 (Меню> Файл> Кодировка файла), и проблема была решена.
Похоже, у вас есть какой-то невидимый символ в самом начале вашего файла.