2015-11-18 2 views
-1

Мне нужно прочитать следующий txt.file с Scanner в java. Проблема с этим файлом в том, что есть много информации, которая мне не нужна. Единственное, что мне нужно - это параметр (ы) и значения этих параметров (в качестве примера мне нужны строки n и int 5, String p и double 0.5, String lambda и double 0.3 ...), проблема кажется в пустых строках. Я добавил код, который я сделал, но если я его запустил, вторая строка дистрибутива никогда не будет читаться.Сбой при чтении файла со сканером и пропуском строк

Что я делаю неправильно?

TXT-файл в качестве входных данных:

distributie lengte klasse 1 naam verdeling parameter(s) value of parameter 
         n  5 
         p  0.5 
distributie lengte klasse 2 naam verdeling parameter(s) value of parameter 
         lambda  0.3 

distributie incidentie klasse 1 naam verdeling parameter(s) value of parameter 
         d  1 

distributie incidentie klasse 2 naam verdeling parameter(s) value of parameter 
         n  8 
         p  0.1  
distributie servertijd klasse 1 naam verdeling parameter(s) value of parameter 
         d  1 

distributie servertijd klasse 2 naam verdeling parameter(s) value of parameter 
         p  0.3 

aantal pakketten te verwerken     2000000 

код

for(int a = 0; a< 6; ++a){ 

inputStream.nextLine(); 
System.out.print("\n"+inputStream.next()); 
System.out.print("\n"+inputStream.next()); 
String line = ""; 
if (!(line = inputStream.nextLine()).isEmpty()) 
    { 
    System.out.print("\n"+inputStream.next()); 
    System.out.print("\n"+inputStream.next()); 
    } 
else 
{ 

} 
inputStream.nextLine(); 
}} 
+0

Возможный дубликат [Пропуск nextLine() после используя next(), nextInt() или другие методы nextFoo()] (http://stackoverflow.com/questions/13102045/skipping-nextline-after-using-next-nextint-or-other-nextfoo-methods) – thegauravmahawar

+0

Просто подсказка: вам не нужно 'else {}'. Если вы ничего не делаете в '' '' '' '' ', вы можете избежать его. –

ответ

0

Короткий ответ: Не использовать Scanner.

Вы сказали, что «хотите прочитать следующий txt.file со сканирующим методом», но вы не сказали, почему, и мы не всегда получаем то, что нам нравится. В этом случае использование Scanner далек от лучшего выбора.

Глядя на файл, формат представляется данными в блоках из 3 строк, первая строка начинается со слова distributie. В конце файла есть сводная строка, начинающаяся с aantal.

Линии 2 и 3 каждого блока представляют собой либо ключевое слово + десятичное число, либо пустую строку. Так как вы только после того, как эти пары ключевых слов + номер, я предлагаю читать файл строка за строкой, и сопоставления ключевых слов + номер строки, используя регулярное выражение:

try (BufferedReader in = new BufferedReader(new FileReader(file))) { 
    Pattern p = Pattern.compile("\\s+(\\w+)\\s+([0-9.]+)\\s*"); 
    for (String line; (line = in.readLine()) != null;) { 
     Matcher m = p.matcher(line); 
     if (m.matches()) { 
      String keyword = m.group(1); 
      double number = Double.parseDouble(m.group(2)); 
      System.out.println(keyword + " = " + number); 
     } 
    } 
} 
+0

спасибо за вашу помощь, я никогда не работал с регулярным выражением, но я дам ему попробовать ... Если я использую это, будет найдено только одно ключевое слово и число. мне нужно создать еще один цикл вокруг него, чтобы он прошел через весь txt.file? – StudentX

+0

К сожалению, последний символ шаблона должен быть '*', а не '+'. – Andreas

0

Вот некоторые улучшения:

  • Для заголовке цикла я бы использовать a++ для увеличения a - просто предпочтение.
  • .nextLine() возвращает String, поэтому, возможно, перезагрузите переменную inputStream после выполнения .nextLine().
  • Печать inputStream.nextLine(), а не inputStream.next().
  • В if условный я бы не инициализировал переменную line.
  • Условие if else не обязательно должно быть там, чтобы сделать то, что вы хотите, то есть прочитать шесть значений.

Моя рекомендация, чтобы прочитать о REGEX и если REGEX линии соответствует n,p,lamda,d и другое значение, а затем распечатать.

for(int a = 0; a< 6; a++){ 
    inputStream.nextLine(); 
    //possibly reset inputStream here with something like inputStream = new Scanner(...); 
    System.out.print("\n"+inputStream.nextLine()); 
    System.out.print("\n"+inputStream.nextLine()); 
} 
Смежные вопросы