Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > чтение файла


Автор: linkil 21.1.2012, 17:29
подскажите 

есть файл в котором лежат данные такого вида


Код

...
0.000000000000E+00 2.356092445552E-04 1.932676241267E-12 0.000000000000E+00
2.080000000000E+02-1.019375000000E+02 3.854803425178E-09-2.144093904952E+00
-5.319714546204E-06 5.169815733097E-03 1.182034611702E-05 5.153629537582E+03
...


Делаю через сканер
Код

...
while (scanner.hasNext()){
str=scanner.next();
a1=Double.parseDouble(str);
}
...


получаю NumberFormatException если значения "сливаются" т.е.
2.080000000000E+02-1.019375000000E+02

как лучше обработать такую строку ?

Спасибо
 

Автор: dorogoyIV 21.1.2012, 18:42
Цитата(linkil @  21.1.2012,  17:29 Найти цитируемый пост)
2.080000000000E+02-1.019375000000E+02

может быть обрабатывать по точке?
два точка нуль, один точка нуль
т.е. находить начало числа по точке, потом делить на токены?

Автор: Pawl 21.1.2012, 22:29
судя по примеру, все Ваши числа одинаковой длины и каждая строка начинается с нового числа, а не с "хвоста" предыдущего. В этом случае я бы считывал файл построчно, а потом отрезал бы от строки куски по 18 или 19 символов (в зависимости от знака) и парсил бы этот кусок в double.
Код

     String s = "-1.019375000000E+02 -5.169815733097E-03";
     String st = "";
     if (s.startsWith("-")) {
         st = s.substring(0, 19);
         s = s.substring(19, s.length());
     } else {
         st = s.substring(0, 18);
         s = s.substring(18, s.length());
     }
        
        double d = Double.parseDouble(st);
     s = s.trim();

Если же числа разной длины и расположены в разных строках, то тогда лучше использовать регулярные выражения, что сложнее.

Автор: turbanoff 24.1.2012, 07:50
Цитата

Если же числа разной длины и расположены в разных строках, то тогда лучше использовать регулярные выражения, что сложнее.

Регулярку можно взять и чужую, если не разбираетесь. Например отсюда http://stackoverflow.com/questions/3681242/java-how-to-parse-double-from-regex
немного допиливаем под наши ограничения.
Зато ничего не разъедется при малейшем исправлении
Код

        String st = "0.000000000000E+00 2.356092445552E-04 1.932676241267E-12 0.000000000000E+00"+
                   "2.080000000000E+02-1.019375000000E+02 3.854803425178E-09-2.144093904952E+00"+
                   "-5.319714546204E-06 5.169815733097E-03 1.182034611702E-05 5.153629537582E+03";
        
        Pattern compile = Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]{1,2})?");
        Matcher matcher = compile.matcher(st);
        
        while (matcher.find()) {
            System.out.println(matcher.group());
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)