我一直试图从csv文件中读取并填充State对象数组,但是数组永远不会被填充超过1st([0])索引。 csv文件的格式如下:
Mississippi,Jackson,MS,2991207,South,4
New Hampshire,Concord,NH,1323459,New England,2
其中每组数据由新行分隔。
inFile.useDelimiter(",|\n");
String headerLine = inFile.nextLine();
for(int i = 0; i<50; i++) {
while(inFile.hasNext()) {
State state = new State(inFile.next(), inFile.next(), inFile.next(), inFile.nextInt(),
inFile.next(), inFile.nextInt());
stateArray[i] = state;
}
}
这是用于使用元素填充状态数组的代码。它使用名为inFile的Scanner来解析csv。我不知道怎么做才能做到这一点。我已经使用print语句进行了测试,只有stateArray的第一个索引才会填充任何字段。
System.out.println(stateArray[0].GetStateName());
例如,返回&#34; Mississippi&#34;,但任何其他索引都会导致空指针异常。
答案 0 :(得分:2)
你的for循环中有一个while循环。 while循环将继续执行,直到您读完整个infile,此外它将继续覆盖stateArray [0]索引。
有几个选项可以逐行处理此文件。
您可以做的一件事是使用两个独立的扫描仪。
for (int i = 0; i < 50 && infile.hasNextLine(); i++) {
String line = infile.nextLine();
Scanner stateLine = new Scanner(line);
stateLine.useDelimiter(",");
try {
stateArray[i] = new State(stateLine.next(), stateLine.next(), stateLine.next(), stateLine.nextInt(), stateLine .next(), stateLine.nextInt());
} catch (Exception e) {
e.printStackTrace();
// This is optional, just there so you can see why your input is throwing an error.
}
stateLine.close();
}
还有其他解决方案可供选择,您可能需要考虑输入是否保证格式正确,或者格式和文件长度是否可变。
答案 1 :(得分:1)
也许尝试使用库来阅读此内容,因为如果任何值包含逗号,您的解决方案将失败(您将无意中将其拆分为2)。
这是我使用univocity-parsers的实现:
在@Parsed
课程的字段中添加一些State
注释。我不知道字段名称是什么,所以我只是编写了属性名称并为每个名称分配了一个位置。
public class State {
@Parsed(index = 0)
String name;
@Parsed(index = 1)
String city;
@Parsed(index = 2)
String acronym;
@Parsed(index = 3)
String postcode;
@Parsed(index = 4)
String conty;
@Parsed(index = 5)
int id;
}
现在,要将文件解析为State
个对象的列表,只需执行以下操作:
List<State> states = new CsvRoutines().parseAll(State.class, new File(inputFile), "UTF-8");
希望它有所帮助。
披露:我是这个csv解析库的作者。它是开源和免费的(Apache 2.0许可证)。