0

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?

Wojciech Wirzbicki
  • 3,887
  • 6
  • 36
  • 59
ninesalt
  • 4,054
  • 5
  • 35
  • 75

6 Answers6

3

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;

    ...
}
evomiester
  • 41
  • 3
2

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 ){

Jens
  • 67,715
  • 15
  • 98
  • 113
1

Try this.

while(x.readLine() != null){
---`enter code here`
}
Rahul T
  • 88
  • 5
1

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

Robin Chander
  • 7,225
  • 3
  • 28
  • 42
1
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

Bhargav Modi
  • 2,605
  • 3
  • 29
  • 49
0

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]));
Fahim
  • 12,198
  • 5
  • 39
  • 57