Java - 读取 CSV 文件错误
Java - Reading from CSV File Error
所以我的问题是我正在尝试从 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;
}
不要手动解析CSV使用OpenCSV这是一个用于CSV解析的开源库
您收到异常是因为您发送到 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 的调试方法。它将对您编码有很大帮助!
所以我的问题是我正在尝试从 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;
}
不要手动解析CSV使用OpenCSV这是一个用于CSV解析的开源库
您收到异常是因为您发送到 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 的调试方法。它将对您编码有很大帮助!