0

我正在尝试使用 a 读取 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());

是文件的问题还是算法的问题?

4

6 回答 6

3

您的问题是连续两次调用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;

    ...
}
于 2015-02-18T15:44:36.577 回答
2

有一句话“你场上每有一张魔法卡,攻击力和防御力就增加 500”。不包含任何,. 所以stArray[]长度为1。

另一件事:Java 数组是零基数。

并且for( String p = x.readLine(); p != null ; p = x.readLine()){应该是 while ((String p = x.readLine())!= null ){

于 2015-02-18T14:13:29.997 回答
1

试试这个。

while(x.readLine() != null){
---`enter code here`
}
于 2015-02-18T14:12:41.517 回答
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 下载

于 2015-02-18T14:12:43.240 回答
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());

这应该有效

于 2015-02-18T14:13:02.700 回答
0

错误在这里抛出

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

添加此条件并检查

String [] stArray = p.split(",");
ArrayList.add(new Card( stArray[0], stArray[1]));
于 2015-02-18T14:11:44.763 回答