2016-04-13 12 views
1

私は少し助けを求めています。私は少しの成功でほとんどグーグルをしてきました。テキストファイルの解析が次の行に移動しないとき

私はプログラミングが初めてで、これは私の愚かな監督だと確信しています。

以下のコードは、タブ区切りの.txtドキュメントを読むことを目的としています。 .txtファイルは6つの列にフォーマットされています。現在、ファイルを移動するときに、文字列を適切な値型に解析し、それをそれぞれの変数に代入します。コードはここにある:私は最初の行の最後の列に達したとき、可変料金を改行はwhileループをトリガされていない何らかの理由で1列6、行2列1行に設定されて

 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(); 
      } 
     } 

再起動します。

私は、whileループが行末で再起動しない理由を理解できますか?

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

この約1200行があります:

ファイルは次のようになります。このループを実行すると、最初の行の最後に運賃= 211.3375を設定しようとすると、以下のエラーが発生します。なんらかの理由で、改行はループをリセットしていません。改行はタブとして解釈されないが、これを修正する方法はわからないとしか思えない。

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

+0

正直言って、私はあなたの流れを変更して文字列に読み込んだ後、タブのcharを使ってString.splitを行うようにしています。明らかにあなたはEOLチャーを読んでいません。 –

+0

'Scanner'クラスに' nextInt'と 'nextDouble'があるとき、なぜ' Integer#parseInt'か 'Double#parseDouble'を使うのですか? –

答えて

4

あなたはScanner#hasNextLine()をチェックするが、その後、複数のScanner#next()、行うには危険なものを読んでいます。私はあなたが次の行を確認する場合は、を読んで、その行を解析することをお勧めします。

私が最初にチェックせずに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 
} 

しかし、たとえ、これはやや危険です。だから、おそらくより安全が

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 
} 

か悪いかのファイルをチェックするのtry/catchブロックを使用します。

それともような何かを行うことができます。

+0

あなたのご意見をお寄せいただきありがとうございます。最初のコードブロックで提案した変更を行いました。何らかの理由で、私は今InputMismatchExceptionを投げています。理由を特定しようとしていますが、あまり成功していません。 – Zeeboot

+0

@ Zeeboot:何が間違っているかを教えてくれるので、例外スタックトレースを常に注意深く見てください。また、デバッガを使用して、コードが実行されているときの変数の状態を確認します。 –

+0

ありがとうホバークラフト。私は間違いなくそれをやろうとします。私は経験が不足していると思うので、ちょっと難しいですが一発の価値があります。 – Zeeboot

関連する問題