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

将数据从文件中获取到对象数组中(java),java,arrays,csv,oop,object,Java,Arrays,Csv,Oop,Object,我一直在尝试从csv文件读取并填充一个状态对象数组,但数组的填充量从未超过第一个([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 =

我一直在尝试从csv文件读取并填充一个状态对象数组,但数组的填充量从未超过第一个([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;
        }
    }

例如,返回“Mississippi”,但任何其他索引都会导致空指针异常。

for循环中有一个while循环。while循环将继续执行,直到您读取了整个内嵌,此外,它将继续覆盖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();
}
for(int i=0;i<50&&infle.hasNextLine();i++){
字符串行=infle.nextLine();
扫描仪状态行=新扫描仪(行);
stateLine.useDelimiter(“,”);
试一试{
stateArray[i]=新状态(stateLine.next()、stateLine.next()、stateLine.next()、stateLine.nextInt()、stateLine.nextInt()、stateLine.nextInt());
}捕获(例外e){
e、 printStackTrace();
//这是可选的,只是为了让您了解输入抛出错误的原因。
}
stateLine.close();
}

还有其他解决方案,你可能想考虑你的输入是否保证格式正确或者是否有可变的格式和文件长度。

< P>也许尝试使用一个库来读取这个,因为如果任何值包含逗号(如果你无意中把它分成2个),你的解决方案就会失败。 以下是我的实现,使用:

状态
类的字段中放置一些
@解析的
注释。我不知道字段名是什么,所以我只是编了属性名并为每个属性分配了一个位置

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");
List states=new CsvRoutines().parseAll(State.class,新文件(inputFile),“UTF-8”);
希望能有帮助


披露:我是这个csv解析库的作者。它是开源和免费的(Apache 2.0许可证)。

这是完全正确的,所以请将答案设置为true!
List<State> states = new CsvRoutines().parseAll(State.class, new File(inputFile), "UTF-8");