2011-10-10 84 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類。