JAVA – 将CSV导入ArrayList

我正在使用StringTokenizer尝试将导入CSV文件导入Arraylist

 public class Test { public static void main(String [] args) { List datalist = new ArrayList(); try { FileReader fr = new FileReader("c:\\temp.csv"); BufferedReader br = new BufferedReader(fr); String stringRead = br.readLine(); while( stringRead != null ) { StringTokenizer st = new StringTokenizer(stringRead, ","); String docNumber = st.nextToken( ); String note = st.nextToken( ); /** PROBLEM */ String index = st.nextToken( ); /** PROBLEM */ ImportedXls temp = new ImportedXls(docNumber, note, index); datalist.add(temp); // read the next line stringRead = br.readLine(); } br.close( ); } catch(IOException ioe){...} for (ImportedXls item : datalist) { System.out.println(item.getDocNumber()); } } } 

我不明白nextToken是如何工作的,因为如果我将初始化三个变量( docNumbernoteindex )保持为nextToken() ,它将失败:

 Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(Unknown Source) at _test.Test.main(Test.java:32) 

如果我只保留docNumber,它就可以了。 你可以帮帮我吗?

您的输入文件的某些行似乎有少于3个逗号分隔的字段。您应该始终检查tokenizer是否有更多的令牌(StringTokenizer.hasMoreTokens),除非您100%确定您的输入是正确的。

CORRECT解析CSV文件并非如此简单。 为什么不使用能够做得很好的库 – http://opencsv.sourceforge.net/

看起来你的代码正在变成一条线,Tokenizer只分成1部分而不是3部分。是否可能有缺少数据的行? 如果是这样,你需要处理这个问题。

很可能你的输入文件不包含至少一行分隔的另一个元素。 请告诉我们您的输入 – 如果可能,请输入失败的行。

但是,您不需要使用StringTokenizer 。 使用String#split()可能更容易:

 ... while( stringRead != null ) { String[] elements = stringRead.split(","); if(elements.length < 3) { throw new RuntimeException("line too short"); //handle missing entries } String docNumber = elements[0]; String note = elements[1]; String index = elements[2]; ImportedXls temp = new ImportedXls(docNumber, note, index); datalist.add(temp); // read the next line stringRead = br.readLine(); } ... 

您应该能够使用hasMoreTokens()方法检查您的令牌。 如果返回false,则您读取的行可能不包含任何内容(即空字符串)。

尽管使用String.split()方法会更好 – 如果我没有弄错,有计划弃用StringTokenizer类。