7

次のデータを含むログファイルがあります。

最短パス(2):: RV3280-RV0973C-RV2888C
最短パス(1):: RV3280-RV2502C
最短パス(2):: RV3280-RV2501C-RV1263
最短パス(2):: RV2363-Rv3285-RV3280

各行から、括弧内の番号、最初のタンパク質の名前(最初の行のRV3280)、および最後のタンパク質の名前(最初の行のRV2888C)が必要です。

Scannerオブジェクトを使用してこのためのコードを作成しました。

try{
                Scanner s = new Scanner(new File(args[0]));
                while (s.hasNextLine()) {
                    s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern
                    MatchResult result = s.match(); // results from
                    for (int i=1; i<=result.groupCount(); i++) {
                        System.out.println(result.group(i));
                    }
                    s.nextLine(); // line no. 29
                }
                s.close();
        }

        catch (FileNotFoundException e) {
            System.out.print("cannot find file");
        }

希望する結果が得られますが、エラーメッセージも表示されます。上記の入力ファイルに対して取得する出力は次のとおりです。

Exception in thread "main" java.util.NoSuchElementException: No line found
        at java.util.Scanner.nextLine(Scanner.java:1516)
        at nearnessindex.Main.main(Main.java:29)
2
RV3280
RV2888C
1
RV3280
RV2502C
2
RV3280
RV1263
2
RV2363
RV3280
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)

このエラーが発生する理由と、それを修正するにはどうすればよいですか?

4

2 に答える 2

3

入力データは、おそらくこれを引き起こす行区切り文字で終わっていません。を呼び出すとfindInLine、スキャナーが一致するパターンを超えて移動します。呼び出し時に入力データの最後にいる場合は、スキャナーnextLineがスローされます。NoSuchElementException

コードを大幅に再配置せずに簡単に修正するには、whileループを次のように終了します。

if (s.hasNextLine()) {
    s.nextLine();
}
于 2010-09-06T15:48:51.023 に答える
0
    public static void main(String[] args) {
            Scanner s = new Scanner("Shortest path(2)::RV3280-RV0973C-RV2888C"
                    + "\nShortest path(1)::RV3280-RV2502C"
                    + "\nShortest path(2)::RV3280-RV2501C-RV1263"
                    + "\nShortest path(2)::RV2363-Rv3285-RV3280");
            while (s.hasNextLine()) {
                s.findInLine("Shortest path\\((\\d+)\\)::(\\w+).*-(\\w+)"); // at each line, look for this pattern
                MatchResult result = s.match(); // results from
                for (int i = 1; i <= result.groupCount(); i++) {
                    System.out.println(result.group(i));
                }
                s.nextLine(); // line no. 29
            }
            s.close();
    }
}

run:
2
RV3280
RV2888C
1
RV3280
RV2502C
2
RV3280
RV1263
2
RV2363
RV3280
BUILD SUCCESSFUL (total time: 0 seconds)

これは私にとってはうまくいきます、多分あなたはあなたのファイルにいくつかの奇妙な文字や空の行を持っていますか?

最後に2つの空の行があると、次のようになります。スレッド "main"の例外java.lang.IllegalStateException:一致する結果がありません

入力ファイルが厳密にフォーマットされている場合は、そのようなことを行うことができます。これは、その厄介な正規表現を取り除くことができるため、はるかに簡単です;)

    String[] lines = new String[]{"Shortest path(2)::RV3280-RV0973C-RV2888C", "Shortest path(1)::RV3280-RV2502C", "Shortest path(2)::RV3280-RV2501C-RV1263", "Shortest path(2)::RV2363-Rv3285-RV3280", "\n", "\n"};
    final int positionOfIndex = 14;
    final int startPositionOfProteins = 18;
    for (String line : lines) {
        if (!line.trim().isEmpty()) {
            System.out.print(line.charAt(positionOfIndex) + ": ");
            String[] proteins = line.substring(startPositionOfProteins).split("-");
            System.out.println(proteins[0] + " " + proteins[proteins.size() -1]);

        }
    }
于 2010-09-06T15:37:28.323 に答える