2011-10-10 45 views
6

我使用StringTokenizer尝试导入CSV文件ArraylistJAVA - 导入CSV到ArrayList的

public class Test 
{ 
    public static void main(String [] args) 
    { 
    List<ImportedXls> datalist = new ArrayList<ImportedXls>(); 

    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只是,它的工作原理。你可以帮帮我吗?

+2

为什么你不使用'stringRead.split(“,”)'? – Thomas

+0

显示典型的行 – duffymo

+0

opencsv库使读取csv文件变得非常简单,无需编写自己的代码。 – Pete855217

回答

18

看来,您的输入文件的一些行有少于3个逗号分隔fields.You应该总是检查如果tokenizer有更多的令牌(StringTokenizer.hasMoreTokens),除非你是100%确定你的输入是正确的。

正确解析CSV文件并不是那么简单的任务。为什么不使用可以做得很好的库 - http://opencsv.sourceforge.net/

+0

你是正确的,问题在CSV文件!谢谢openCsv,我也会试试看:-) – gaffcz

+0

去opencsv。试想一下,如果'note'字段包含逗号,那么将要使用的代码将会发生什么。另一个问题@stackoverflow? :) – aav

+0

你的建议终于最方便了,非常感谢你! (不用担心,接下来的问题即将到来:D – gaffcz

2

看起来像你的代码越来越接近一个线,Tokenizer只分解成1部分而不是3。是否有可能有缺失数据的线?如果是这样,你需要处理这个。

+0

您说得对,问题在于CSV文件!谢谢:-) – gaffcz

2

很可能您的输入文件不包含至少一行中由,分隔的另一个元素。请向我们展示您的输入 - 如果可能的话,输入失败的线路。但是,您不需要使用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(); 
} 
... 
+0

谢谢,就是这样! CSV文件没有三列无处不在。现在我试图使用你的代码:-) – gaffcz

2

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

虽然使用String.split()方法会更好 - 如果我没有弄错,有计划不推荐使用StringTokenizer类。