2016-04-13 3 views
1

Я ищу небольшую помощь. Я немного поработал с поисковой системой с небольшим успехом.Когда синтаксический ввод текстового файла не переходит к следующей строке

Я новичок в программировании и уверен, что это глупый промах с моей стороны.

Данный код предназначен для чтения документа .txt с разделителем табуляции. Файл .txt форматируется в шесть столбцов. В настоящее время, когда я перемещаюсь по файлу, я разбираю строку до соответствующего типа значения и назначаю ее соответствующей переменной. Код здесь:

 try { 
      s = new Scanner(new BufferedReader(new FileReader(file))).useDelimiter("\t"); 
      while (s.hasNextLine()) { 
       group = Integer.parseInt(s.next()); 
       death = Integer.parseInt(s.next()); 
       name = s.next(); 
       sex = s.next(); 
       age = Integer.parseInt(s.next()); 
       fare = Double.parseDouble(s.next()); 
       System.out.println("Class = " + group); // Test that value is being assigned 
       System.out.println("Death = " + death); // Test that value is being assigned 
       System.out.println("Name = " + name); // Test that value is being assigned 
       System.out.println("Gender = " + sex); // Test that value is being assigned 
       System.out.println("Age = " + age); // Test that value is being assigned 
       System.out.println("Fare = " + fare); // Test that value is being assigned 
      } 
     } finally { 
      if (s != null) { 
       s.close(); 
      } 
     } 

Когда я достигаю последний столбец первой строки, переменная тариф устанавливается в строке 1 колонки 6 и строка 2 столбца 1. По какой-то причине разрыва строки не запуская время цикла Заново.

Может ли кто-нибудь помочь мне понять, почему цикл while не перезапускается в конце строки?

файла выглядит следующим образом:

1  5  Bryan  male  25  211.3375  
1  2  Jimmy  male  22  151.5500 

Существует около 1200 строк этого. При запуске этого цикла я получаю следующую ошибку при попытке установить fare = 211.3375 в конце первой строки. По какой-то причине разрыв строки не сбрасывает цикл. Я могу только предположить, что разрыв строки не интерпретируется как вкладка, но не знает, как исправить это.

Exception in thread "main" java.lang.NumberFormatException: For input string: "211.3375 1"

+0

, если быть честным, я бы изменил ваш поток, чтобы сделать nextLine, чтобы прочитать в String, а затем сделать String.split, используя знак tabs. Очевидно, вы не читаете символ EOL. –

+0

Зачем использовать 'Integer # parseInt' или' Double # parseDouble', когда класс 'Scanner' имеет' nextInt' и 'nextDouble'? –

ответ

4

Вы проверки Scanner#hasNextLine() но чтение мультипликатор Scanner#next(), опасная вещь, чтобы сделать. Я предлагаю, если вы проверите следующую строку, вы должны прочитать следующую строку, а затем проанализировать эту строку.

например,

while (s.hasNextLine()) { 
    String line = s.nextLine(); 
    Scanner lineScanner = new Scanner(line); 
    group = lineScanner.nextInt(); 
    death = lineScanner.nextInt(); 
    name = lineScanner.next(); 
    sex = lineScanner.next(); 
    age = lineScanner.nextInt(); 
    fare = lineScanner.nextDouble(); 
    lineScanner.close(); 
    System.out.println("Class = " + group); // Test that value is being assigned 
    System.out.println("Death = " + death); // Test that value is being assigned 
    System.out.println("Name = " + name); // Test that value is being assigned 
    System.out.println("Gender = " + sex); // Test that value is being assigned 
    System.out.println("Age = " + age); // Test that value is being assigned 
    System.out.println("Fare = " + fare); // Test that value is being assigned 
} 

Но даже это несколько опасно, потому что я звоню Scanner#next...() без предварительной проверки. И поэтому, возможно, безопаснее было бы сделать

String[] tokens = line.split("\\s+"); 

Затем подсчитывают длину токенов, чтобы убедиться, что это правильно, а затем разобрать каждый отдельный маркер, который нуждается в разборе для числового типа.

Или вы могли бы сделать что-то вроде:

while (s.hasNextLine()) { 
    String line = s.nextLine(); 
    Scanner lineScanner = new Scanner(line); 

    if (lineScanner.hasNextInt()) { 
     group = lineScanner.nextInt(); 
    } 
    if (lineScanner.hasNextInt()) { 
     death = lineScanner.nextInt(); 
    } 
    if (lineScanner.hasNext()) { 
     name = lineScanner.next(); 
    } 
    if (lineScanner.hasNext()) { 
     sex = lineScanner.next(); 
    } 
    if (lineScanner.hasNextInt()) { 
     age = lineScanner.nextInt(); 
    } 
    if (lineScanner.hasNextDouble()) { 
     fare = lineScanner.nextDouble(); 
    } 
    lineScanner.close(); 

    System.out.println("Class = " + group); // Test that value is being assigned 
    System.out.println("Death = " + death); // Test that value is being assigned 
    System.out.println("Name = " + name); // Test that value is being assigned 
    System.out.println("Gender = " + sex); // Test that value is being assigned 
    System.out.println("Age = " + age); // Test that value is being assigned 
    System.out.println("Fare = " + fare); // Test that value is being assigned 
} 

или использовать попытаться/поймать блоков, чтобы проверить наличие поврежденных файлов.

+0

Большое спасибо за все ваши данные. Я внес изменения, которые вы предложили в первом блоке кода. По какой-то причине я сейчас бросаю исключение InputMismatchException. Я пытаюсь определить причину, но у меня нет большого успеха. – Zeeboot

+0

@ Zeeboot: Всегда критически смотришь на исключение stacktrace, поскольку он скажет вам, что не так. Также используйте отладчик, чтобы увидеть состояние ваших переменных при запуске кода. –

+0

Спасибо, Судно на воздушной подушке. Я обязательно попытаюсь это сделать. Я думаю, что мой недостаток опыта сделает это немного сложным, но стоит того. – Zeeboot

Смежные вопросы