我发现了问题。显然,csv文件中的某些名称中存在随机空格,这导致第257个条目中断,以及之后的其他几个条目。所以,我刚拿出空间,现在一切正常。感谢所有试图提供帮助的人。
我有这个代码从csv文件中读取,将值放在String数组中,并打印出来供我查看。它运行正常,直到它到达数组的第257个成员(每个成员有3个值:姓氏,名字和出生年份)。这是代码的功能版本:
package testing.csv.files;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//.csv comma separated values
String fileName = "C:/Users/Owner/Desktop/Data.csv";
File file = new File(fileName); // TODO: read about File Names
try {
Scanner inputStream = new Scanner(file);
inputStream.next(); //Ignore first line of titles
while (inputStream.hasNext()){
String data = inputStream.next(); // gets a whole line
String[] values = data.split(",");
System.out.println(data);
}
inputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
现在,当我更改行
时 System.out.println(data);
对此:
System.out.println(values[2]);
我期望发生的事情是,只为阵列中的每个人打印出生年份(第3列)。但是,它只打印到第257个人的出生年份(超过18,000),并给我以下错误信息:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at testing.csv.files.Test.main(Test.java:22)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)
“java:22”似乎是指我上面发布的上述代码片段,我改变了。我不确定问题是什么。如果我的语法错误,为什么要打印?我唯一能想到的是,字符串数组可能只能处理257个不同的人,每个人都有自己的3个值。如果是这种情况,那么我需要某种更大版本的字符串来保存我的所有数据。以前有人遇到过这个问题吗?问题出在我的语法和循环中吗?
答案 0 :(得分:0)
如果values
数组中只有两件事,那么您可以索引的最高位置是1
。
对于数组,您只能索引size - 1
个点;也就是说,如果您的数组大小为10,则可以索引到位置9或更详细:array[9]
。
将索引语句更改为:
System.out.println(values[1]);
答案 1 :(得分:0)
更改:
String data = inputStream.next();
// next()只能读取输入直到空格
到:
String data = inputStream.nextLine();
// nextLine()读取包含单词之间空格的输入
更好的方法是迭代数组而不是通过索引访问可能是csv中不包含第三列的特定行。
答案 2 :(得分:0)
您可能希望在csv文件中看到第257条记录。 split方法会为它创建三个令牌吗?如果它应该导致少于三个令牌,并且您尝试通过键入
来打印第三个令牌System.out.println(values[2]);
你会得到一个ArrayIndexOutOfBoundsException。