从 CSV 文件读取时数组索引超出范围
Array Index out of bounds when reading from CSV file
我正在尝试使用 BufferedReader
读取 CSV 文件,但由于某种原因,我在 7 行后遇到越界异常。我在另一个 CSV 文件(30 行)上尝试了这个精确算法,它运行良好。 Here 是有问题的 CSV 文件。
String spellPath = "file path is here";
FileReader y = new FileReader(spellPath);
BufferedReader x = new BufferedReader(y);
ArrayList<Card> ArrayList = new ArrayList<Card>( ); //dynamic data type
for( String p = x.readLine(); p != null ; p = x.readLine()){
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[1], stArray[2])); //new card with name and desc only
}
System.out.println(ArrayList.toString());
是文件的问题还是算法的问题?
此处抛出错误
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[1], stArray[2]));
添加此条件并检查
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));
试试这个。
while(x.readLine() != null){
---`enter code here`
}
您在循环中调用了 x.readLine()
两次。因此,您在阅读时会跳行。
更好的方法是使用 CSVReader 而不是缓冲的 reader.
CSVReader reader = new CSVReader(new FileReader(fName), ',','"','|');
List content = reader.readAll();//do not use this if CSV file is large
String[] row = null;
for (Object object : content) {
row = (String[]) object;
row = Arrays.toString(row).split(",");
//now you have a row array with length equal to number of columns
}
这是获取 CSVReader 的 link - CSVReader Download
while((String p = x.readLine()) != null){
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1])); //new card with name and desc only
}
System.out.println(ArrayList.toString());
这应该有效
有一行 "gains 500 ATK and DEF for each Spell Card you have on the field." 不包含任何 ,
。所以 stArray[]
的长度为 1。
其他:Java 数组是零基数。
而for( String p = x.readLine(); p != null ; p = x.readLine()){
应该是
while ((String p = x.readLine())!= null ){
您的问题是连续两次调用 p=x.readLine()
for( String p = x.readLine(); p != null ; p = x.readLine()){
...
}
因此,读取了 2 行,仅检查了 1 行是否为空
您需要将循环更改为
while (true) {
String p= x.readLine();
if (p == null) break;
...
}
我正在尝试使用 BufferedReader
读取 CSV 文件,但由于某种原因,我在 7 行后遇到越界异常。我在另一个 CSV 文件(30 行)上尝试了这个精确算法,它运行良好。 Here 是有问题的 CSV 文件。
String spellPath = "file path is here";
FileReader y = new FileReader(spellPath);
BufferedReader x = new BufferedReader(y);
ArrayList<Card> ArrayList = new ArrayList<Card>( ); //dynamic data type
for( String p = x.readLine(); p != null ; p = x.readLine()){
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[1], stArray[2])); //new card with name and desc only
}
System.out.println(ArrayList.toString());
是文件的问题还是算法的问题?
此处抛出错误
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[1], stArray[2]));
添加此条件并检查
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));
试试这个。
while(x.readLine() != null){
---`enter code here`
}
您在循环中调用了 x.readLine()
两次。因此,您在阅读时会跳行。
更好的方法是使用 CSVReader 而不是缓冲的 reader.
CSVReader reader = new CSVReader(new FileReader(fName), ',','"','|');
List content = reader.readAll();//do not use this if CSV file is large
String[] row = null;
for (Object object : content) {
row = (String[]) object;
row = Arrays.toString(row).split(",");
//now you have a row array with length equal to number of columns
}
这是获取 CSVReader 的 link - CSVReader Download
while((String p = x.readLine()) != null){
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1])); //new card with name and desc only
}
System.out.println(ArrayList.toString());
这应该有效
有一行 "gains 500 ATK and DEF for each Spell Card you have on the field." 不包含任何 ,
。所以 stArray[]
的长度为 1。
其他:Java 数组是零基数。
而for( String p = x.readLine(); p != null ; p = x.readLine()){
应该是
while ((String p = x.readLine())!= null ){
您的问题是连续两次调用 p=x.readLine()
for( String p = x.readLine(); p != null ; p = x.readLine()){
...
}
因此,读取了 2 行,仅检查了 1 行是否为空
您需要将循环更改为
while (true) {
String p= x.readLine();
if (p == null) break;
...
}