我有一个文本文件,其中包含以下行:
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
每个'|' sign表示它有一列。我必须从'|'内的每一行中提取信息迹象。当我尝试以下代码时:
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
我如何正确解析它?
答案 0 :(得分:7)
这是因为String.split使用regex。
在正则表达式中,|
字符是一个特殊字符,表示字符的either the pattern on the left OR on the right
。必须使用反斜杠(\\
)
正确的语法是:
String[] fields = line.split("\\|");
另外,请注意我没有看到for循环的问题,但这也需要修复,这就是为什么ArrayOutOfBoundsException
弹出丑陋的头......
答案 1 :(得分:5)
for(int i=0;i<=fields.length;i++)
需要
for(int i=0;i<fields.length;i++)
('&lt; ='必须是'&lt;')
你的正则表达式的问题也在其他答案中指出。
答案 2 :(得分:3)
|
是正则表达式中的一个特殊字符,它作为OR运算符,您需要使用以下命令来转义表达式:
String[] fields = line.split("\\|");
答案 3 :(得分:3)
而不是for(int i=0;i<=fields.length;i++){
使用for(int i=0;i<fields.length;i++){
所以请使用&lt;而不是&lt; =在条件中。
答案 4 :(得分: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]);
}
答案 5 :(得分: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)));
}
答案 6 :(得分:1)
应小于:for(int i=0;i<fields.length;i++)