1
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class CSVReader
{
public static void main(String[] args) throws FileNotFoundException
{
    Scanner scanner = new Scanner(new File("Lunch.csv"));
    ArrayList<String> AccountNum = new ArrayList<String>();
    ArrayList<String> AccountBal = new ArrayList<String>();
    scanner.useDelimiter(",");
    while(scanner.hasNext())
    {
       AccountNum.add(scanner.next());
       AccountBal.add(scanner.next());
    }
    scanner.close();
    display(AccountNum, AccountBal);
 }

 public static void display(ArrayList AccountNum, ArrayList AccountBal)
 {
     System.out.println("\nThe size of the list is " + AccountNum.size());
     for(int x = 0; x < AccountNum.size(); ++x)
     {
        System.out.println("position " + x + " Number: " + AccountNum.get(x));
        System.out.println("position " + x + " Number: " + AccountBal.get(x));
     }
 }


}

该程序应该从 CSV 文件中读取到两个数组中。它编译得很好,但是当我运行它时它会抛出 NoSuchElementException。该程序仅在使用一个数组时有效。有谁知道它为什么会抛出这个异常以及如何解决它?

4

3 回答 3

4

编辑:为了更正我对 ChrisCM 评论的回答,这将防止您在交替扫描仪输入时收到异常。

while(scanner.hasNext())
{
   AccountNum.add(scanner.next());
   if(scanner.hasNext())
       AccountBal.add(scanner.next());
}

您可能会发现最终得到不均匀的列表(AccountNum 的最后一个元素将是空格),您可以使用以下方法解决此问题

if(AccountNum.get(AccountNum.size() - 1).trim().equals("")) {
    AccountNum.remove(AccountNum.size() - 1);
}

如果您仍然有不均匀的列表,那么您需要调试程序来找出问题所在。

解析输入的另一种方法:

while(scanner.hasNext())
{
   String temp = scanner.next();
   if(temp.trim().equals("") && scanner.hasNext()) {
       throw new Exception("This shouldn't happen");
   } else { 
       AccountNum.add(temp);
   }
   if(scanner.hasNext())
       AccountBal.add(scanner.next());
}

您还可以切换到使用opencsv 之类的库,它可以处理输入文件中的空白字符。

于 2013-05-01T17:14:41.633 回答
1

其中一个帐号没有余额或为空白,或某处多了一个逗号...

于 2013-05-01T17:24:00.380 回答
1

您的输入文件中可能有奇数个项目。您的代码假设每个帐号都有一个,并且只有一个余额。如果您的文件确实满足此要求,则可能是您使用:

scanner.useDelimeter(",");

你可能想成为哪个

scanner.useDelimiter(",|\\n");
于 2013-05-01T17:16:13.017 回答