2

次の行を含むテキストファイルがあります。

150004|2012|12|15|0|0|3|0|0|-3.2411|83.9962|156.3321|1.1785|205.3125|2.0599
150004|2012|12|15|0|10|3|0|0|-3.4206|85.9575|150.4877|1.4142|226.7578|2.4276
150004|2012|12|15|0|20|3|0|0|-2.2696|86.2675|149.3848|2.1553|225.7031|3.4387

すべての'|' 記号は、列があることを示します。'|'の内側にある各行から情報を抽出する必要があります 兆候。次のコードを試してみると:

File filer = new File("C:\\Users\\Ali Y. Akgul\\Desktop\\150004_15122012_G.txt");
        try (BufferedReader reader = new BufferedReader(new FileReader(filer))) {
            while (true) {
                String line = reader.readLine();
                if (line == null) {
                    break;
                }
                String[] fields = line.split("|");
                // process fields here
                for(int i=0;i<=fields.length;i++){
                    System.out.println(fields[i]);
                }
            }
        }
}

それは私に与えます:

1
5
0
0
0
4
|
2
0
1
2
|
1
2
|
1
5
|
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 76
0
|
0
|
3
|
0
|
0
|
-
3
.
2
4
    at testenv.TestEnv.main(TestEnv.java:31)
1
1
|
8
3
.
9
9
6
2
|
1
5
6
.
3
3
2
1
|
1
.
1
7
8
5
|
2
0
5
.
3
1
2
5
|
2
.
0
5
9
9
Java Result: 1

どうすれば正しく解析できますか?

4

7 に答える 7

7

String.splitが正規表現を使用しているためです。

正規表現では、|文字は文字の特殊文字の意味either the pattern on the left OR on the rightです。バックスラッシュでエスケープする必要があります(\\

正しい構文は次のとおりです。

String[] fields = line.split("\\|");

また、forループの問題は見られなかったが、それも修正する必要があることを理解してください。そのため、ArrayOutOfBoundsExceptionポップアップの醜い頭がポップアップします...

于 2013-01-16T14:00:04.620 に答える
5
for(int i=0;i<=fields.length;i++) 

する必要があります

for(int i=0;i<fields.length;i++)

('<='は'<'でなければなりません)

また、他の回答で正規表現の問題が指摘されています。

于 2013-01-16T14:00:03.900 に答える
3

|OR演算子として機能する正規表現の特殊文字です。次を使用して式をエスケープする必要があります。

String[] fields = line.split("\\|");
于 2013-01-16T14:00:20.167 に答える
3

for(int i=0;i<=fields.length;i++){使用 する代わりfor(int i=0;i<fields.length;i++){に、条件で<=の代わりに<を使用します。

于 2013-01-16T14:00:29.173 に答える
2

これを試して:

Path file = Paths.get("C:\\Users\\Ali Y. Akgul\\Desktop\\150004_15122012_G.txt");

ArrayList<String> lines = Files.readAllLines(file, Charset.defaultCharset());
ArrayList<String []> columns = new ArrayList<>();
for(String line : lines){
    columns.add(line.split('\|'));
}

// Now for each line you have columns.
for(String [] s : columns){ 
    System.out.println(Arrays.toString(s));
}

// To get only the values for column 8 onwards (in response to your comment)
for(String [] s : columns){ 
    String [] sublist = Arrays.copyOfRange(s, 8, s.length);
    System.out.println(Arrays.toString(sublist));
}

// To get only the columns from line 8 onwards
for(int i = 0; i < columns.size(); i++){
    System.out.println(Arrays.toString(columns.get(i)));
}        
于 2013-01-16T14:05:06.027 に答える
2

次の行に境界の問題があるようです。

for(int i=0;i<=fields.length;i++){
   System.out.println(fields[i]);
}

する必要があります

for(int i=0;i<fields.length;i++){
   System.out.println(fields[i]);
}
于 2013-01-16T14:01:32.747 に答える
1

以下よりも小さくする必要があります:for(int i=0;i<fields.length;i++)

于 2013-01-16T14:00:46.957 に答える