Reputation: 4354
I'm trying to read a CSV file using a BufferedReader
, but for some reason I get an out of bounds exception after 7 rows. I tried this exact algo on another CSV file (30 rows) and it worked fine. Here is the CSV file in question.
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());
Is the problem with the file or is it with the algorithm?
Upvotes: 0
Views: 6590
Reputation: 41
Your issue here is the 2 consecutive calls to p=x.readLine()
for( String p = x.readLine(); p != null ; p = x.readLine()){
...
}
Due to this, 2 lines are read and only 1 is checked for null
You need to change the loop to
while (true) {
String p= x.readLine();
if (p == null) break;
...
}
Upvotes: 3
Reputation: 7415
You are calling x.readLine()
twice in the loop. Hence you are skipping lines while reading.
Better way would be to use CSVReader rather than the buffered 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
}
Here is the link to get CSVReader - CSVReader Download
Upvotes: 1
Reputation: 69440
There is one line "gains 500 ATK and DEF for each Spell Card you have on the field." that do not contain any ,
. So stArray[]
has a length of 1.
Other thing: Java arrays are zero base.
And for( String p = x.readLine(); p != null ; p = x.readLine()){
should be
while ((String p = x.readLine())!= null ){
Upvotes: 2
Reputation: 2655
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());
this should works
Upvotes: 1
Reputation: 12358
Error is throwing here
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[1], stArray[2]));
Add this condition and check
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));
Upvotes: 0