将数据从文件获取到对象数组(java)

时间:2017-01-25 22:09:21

标签: java arrays csv oop object

我一直试图从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;,但任何其他索引都会导致空指针异常。

2 个答案:

答案 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许可证)。