Я пытаюсь прочитать CSV-файл с помощью BufferedReader, но по какой-то причине после 7 строк я получаю исключение за пределами допустимого диапазона. Я попробовал этот алгоритм с другим файлом CSV (30 строк), и он работал нормально. Здесь находится рассматриваемый файл 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());

Проблема в файле или в алгоритме?

0
ninesalt 18 Фев 2015 в 17:07

6 ответов

Лучший ответ

Есть одна строка «получает 500 АТК и ЗАЩИТУ за каждую Спелл-карту, которая у вас есть на поле». которые не содержат ,. Итак, stArray[] имеет длину 1.

Другое дело: массивы Java имеют нулевую базу.

И for( String p = x.readLine(); p != null ; p = x.readLine()){ должен быть while ((String p = x.readLine())!= null ){

2
Jens 18 Фев 2015 в 14:13

Здесь выкидывает ошибку

String [] stArray = p.split(",");
 ArrayList.add(new Card( stArray[1], stArray[2]));

Добавьте это условие и отметьте

String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));
0
Fahim 18 Фев 2015 в 14:11

Вы дважды вызываете x.readLine() в цикле. Следовательно, вы пропускаете строки при чтении.

Лучшим способом было бы использовать CSVReader , а не буферизованный читатель.

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 - CSVReader Download

1
Robin Chander 18 Фев 2015 в 14:18
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());

Это должно работать

1
Bhargav Modi 18 Фев 2015 в 14:13

Попробуй это.

while(x.readLine() != null){
---`enter code here`
}
1
Rahul T 18 Фев 2015 в 14:12

Ваша проблема заключается в двух последовательных вызовах 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;

    ...
}
3
evomiester 18 Фев 2015 в 15:44