【问题标题】:Java - Reading from CSV File ErrorJava - 从 CSV 文件读取错误
【发布时间】:2026-01-12 20:15:01
【问题描述】:

所以我的问题是我正在尝试从 CSV 文件中读取和写入,但是我遇到了追加到新行然后读取时没有收到以下错误的问题:

现在我想我知道为什么会出现错误,但我可以找到解决方法。我正在使用以下代码写入文件:

public void writeToFile(AbstractAccount account)
{
    StringBuilder sb = new StringBuilder();

    sb.append(account.getFirstname() + ",");
    sb.append(account.getLastname() + ",");
    sb.append(account.getID() + ",");
    sb.append(account.getPhonenum() + ",");
    sb.append(account.getUsername() + ",");
    sb.append(account.getPassword() + ",");
    sb.append(account.getAccounttype());

    FileWriter fw = null;
    try
    {
        fw = new FileWriter("login.csv", true);
        fw.append(System.lineSeparator() + sb.toString());
        fw.close();
    } catch (IOException e)
    {
        e.printStackTrace();
    }
}

问题在于 CSV 文件的内部如下所示:

John,Doe,A1,0123456789,johnd,password1,Admin
Jane,Doe,A2,1234567890,janed,password2,CourseCoordinator
John,Smith,A3,2345678901,johns,password3,Approver
Jane,Smith,A4,356789012,johns,password4,CasualStaff
Test, Test, Test, Test, test, test, Admin

但是当我将它复制到堆栈溢出文本编辑器中时,我可以看到实际格式是这样的:

John,Doe,A1,0123456789,johnd,password1,Admin
Jane,Doe,A2,1234567890,janed,password2,CourseCoordinator
John,Smith,A3,2345678901,johns,password3,Approver
Jane,Smith,A4,356789012,johns,password4,CasualStaff

Test, Test, Test, Test, test, test, Admin

所以当我使用此代码从文件中读取时:

public ArrayList<AbstractAccount> readFromFile(String filename)
{
    BufferedReader br = null;

    String line = "";

    try
    {
        br = new BufferedReader(new FileReader(filename));
        while ((line = br.readLine()) != null)
        {
            // use comma as separator
            String[] attributes = line.split(",");
            accounts.add(CreateAccount(attributes));
        }

    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    return accounts;
}

我得到了我之前提到的那个错误。我已经尝试了几种写入新行的方法,但我找不到一种不给我空白行的方法。有人有什么想法吗?

编辑:创建帐户的代码

public AbstractAccount CreateAccount(String[] data)
{
    String firstname = data[0];
    String lastname = data[1];
    String id = data[2];
    String phonenum = data[3];
    String username = data[4];
    String password = data[5];
    String accounttype = data[6];

    if (accounttype.equals("Admin"))
        return new AdminModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CourseCoordinator"))
        return new CourseCoordinatorModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("Approver"))
        return new ApproverModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CasualStaff"))
        return new CasualStaffModel(firstname, lastname, id, phonenum, username, password);
    else
        return null;
}

【问题讨论】:

  • 你能显示CreateAccount的代码吗?异常发生在那里
  • 添加了 CreateAccount 代码。

标签: java csv bufferedreader indexoutofboundsexception filewriter


【解决方案1】:

您收到异常是因为您发送到CreateAccount 方法的数据(应该以小写字母开头)不是您期望的大小。

例如,如果您发送了一个长度为 3 的字符串数组,并且您尝试从数组中的第 5 位获取密码,您会得到ArrayIndexOutOfBoundsException

最有可能发生的是,由于您的 CSV 解析逻辑,您将一个空数组发送到 CreateAccount 方法。

您可以编辑您的 CreateAccount 代码,使其如下所示:

public AbstractAccount CreateAccount(String[] data)
{
    if(data == null || data.length != 7){

        // received data doesn't contain all the expected fields...
        // maybe check the data before sending it to this method?

        return null;
    }


    String firstname = data[0];
    String lastname = data[1];
    String id = data[2];
    String phonenum = data[3];
    String username = data[4];
    String password = data[5];
    String accounttype = data[6];

    if (accounttype.equals("Admin"))
        return new AdminModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CourseCoordinator"))
        return new CourseCoordinatorModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("Approver"))
        return new ApproverModel(firstname, lastname, id, phonenum, username, password);
    else if (accounttype.equals("CasualStaff"))
        return new CasualStaffModel(firstname, lastname, id, phonenum, username, password);
    else
        return null;
}

希望它有所帮助,另外,我建议您使用您正在使用的 IDE 研究调试方法。它将对您的编码有很大帮助!

【讨论】:

    【解决方案2】:

    不要手动解析 CSV 使用 OpenCSV 这是一个用于 CSV 解析的开源库

    【讨论】: