将CSV读入ArrayList

时间:2018-02-04 22:05:07

标签: java csv arraylist

当我运行它时,我得到一个数组超出范围的异常。我需要在CSV中读取包含每行中学生信息的ArrayList。我还需要能够检查行是否缺少信息或信息太多,并丢弃它所执行的整行。我觉得我可能完全错了,因为我不完全确定如何做到这一点。 我的主要课程是

public class Main {
    static ArrayList<Student> Students = new ArrayList<Student>();

public static void main(String[] args) throws IOException {
    String fileLocation = getFile();
    File file = new File(fileLocation);
    while(!file.exists()) {
        fileLocation = getFile();
    }

    Scanner scnr = new Scanner(fileLocation);
    while (scnr.hasNextLine()) {
        String data[] = scnr.nextLine().split(",");
        Students.add(new Student(data[0], data[1], data[2], data[3]));
    }
}

public static String getFile() throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Enter file location: ");
    String fileLocation = reader.readLine();
    System.out.println(fileLocation);
    return fileLocation;
}
}

我的学生班

public class Student {
    public String fName = "";
    public String lName = "";
    public String logonID = "";
    public String randomNumber = "";

public Student (String fName, String lName, String logonID, String randomNumber) {
    this.setName(fName, lName);
    this.setID(logonID);
    this.setNumber(randomNumber);
}

public Student() {
    fName = "";
    lName = "";
    logonID = "";
    randomNumber = "";
}

public void setName(String firstName, String lastName) {
    this.fName = firstName;
    this.lName = lastName;
}

public void setID(String studentID) {
    this.logonID = studentID;
    logonID.toLowerCase();
}

public void setNumber(String randomNumber) {
    this.randomNumber = randomNumber;
}
}

我得到的错误是“线程中的异常”主“java.lang.ArrayIndexOutOfBoundsException:1     在Main.main(Main.java:23)“

安德鲁,逗号,comma1aj,83559,
安德鲁,Karpenter,karpe1aj,966796,15.7
布兰登,萝卜,turni1bw,715855,
布伦达,味噌,miso1b,747747,
克里斯,擦鞋,shie1c,123784,
大卫,酷派,Cool1d,200100,
Django的,, uncha1d,830700,
埃里克,塔塔,, 400500,
雅各布,杜利特尔,dooli1j,555777,
托马斯·杰斐逊,jeff1t,951753,
卡亚,咖啡,coffee1k,789456,
欧文·威尔逊,wilso1o,456123,
测试,学生,seeli1p_s ,,
,演示,demo1s,58578,

3 个答案:

答案 0 :(得分:1)

在处理这些问题时,您应该首先输入一些调试语句。

首先修改&#34;阅读&#34;代码的一个方面,提供有关已阅读内容的更多详细信息,例如......

Scanner scnr = new Scanner(fileLocation);
while (scnr.hasNextLine()) {
    String text = scnr.nextLine();
    System.out.println("text = " + text);
    String[] data = text.split(",")
    System.out.println("data = " + data.length);
    Students.add(new Student(data[0], data[1], data[2], data[3]));
}

您需要验证已读入的文本至少包含4个元素。这将有助于您确定可能会给您带来问题的文本行

  

好的,我试过了,文本打印了我输入的文件位置。数据长度为1,然后我得到了例外。

Scanner(String)将您提供的String作为要处理/扫描的值。相反,您需要Scanner(File),它将读取您指定的文件。

所以,而不是Scanner scnr = new Scanner(fileLocation);尝试使用Scanner scnr = new Scanner(new File(fileLocation));

  

好的,修好它,我现在得到我想要的输出,除了最后一个&#34;学生&#34;。我得到了另一个数组超出界限的例外,最后一个学生应该打印出来,而且我在线程中也有一个例外&#34;主要&#34;对于&#34;学生的文本输出之一&#34;具有正确数量的信息。当我点击超链接的异常时,它表示找不到Chris,Shoe,shie1c,123784,Exception的来源。检查正确数量的数据条目会解决这个问题吗?

因此基于您的示例代码,Test,student,seeli1p_s,,生成的数组只有3个元素。显然String#split默认删除空元素(即,,生成一个空元素,而split正在删除它。)

要解决此问题,您需要提供-1String#split的{​​{1}}参数,例如......

limit

答案 1 :(得分:0)

Students.add(new Student(data[0], data[1], data[2], data[3]));

该行是否导致异常。相反,您应首先检查数据是否包含4个元素,如果不包含,请不要按照主题中的说明添加学生。

答案 2 :(得分:0)

对于初学者,您应该将file传递给Scanner而不是fileLocation。这将使扫描程序能够读取整个文件。此外,在建立新位置后更新文件,否则循环可能永远不会结束。例如:

File file = new File(fileLocation); 
while(!file.exists()) { 
  System.out.println("The chosen file doesn't exist, please select another") ;
  fileLocation = getFile(); 
  file = new File(fileLocation); 
}

Scanner scnr = new Scanner(file) ;

现在开始填写清单。在尝试访问它们之前,必须确保所有元素都存在。我可以想到两个选择:

<强> 1。通过try和catch(不推荐)来围绕代码。

Scanner scnr = new Scanner(file); 
while (scnr.hasNextLine()) {

   String data[] = scnr.nextLine().split(",");
   try{
        Students.add(new Student(data[0], data[1], data[2], data[3]));
   } catch(Exception e) {
        e.printStacktrace() ;
   } 
}

<强> 2。验证数据数组

Scanner scnr = new Scanner(file); 
while (scnr.hasNextLine()) { 
   String data[] = scnr.nextLine().split(",");
   if(data.length !=4 || data[0].isEmpty()  ||
   data[1].isEmpty()   ||  data[2].isEmpty()  ||  data[3].isEmpty() ){
    // may add additional checks
   continue; //goes to next iteration
 } 
   Students.add(new Student(data[0], data[1], data[2], data[3])); 

}