Я пытаюсь прочитать 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());
Проблема в файле или в алгоритме?
6 ответов
Есть одна строка «получает 500 АТК и ЗАЩИТУ за каждую Спелл-карту, которая у вас есть на поле». которые не содержат ,
. Итак, stArray[]
имеет длину 1.
Другое дело: массивы Java имеют нулевую базу.
И for( String p = x.readLine(); p != null ; p = x.readLine()){
должен быть while ((String p = x.readLine())!= null ){
Здесь выкидывает ошибку
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[1], stArray[2]));
Добавьте это условие и отметьте
String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));
Вы дважды вызываете 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
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());
Это должно работать
Попробуй это.
while(x.readLine() != null){
---`enter code here`
}
Ваша проблема заключается в двух последовательных вызовах 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;
...
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.