2013-10-28 32 views
0

香港專業教育學院得到這個規範的CSV文件:解析一個CSV線

  • 重點 - 結構化的分類:ID,其中ID是一個序列號。有 沒有必要(或使用)這個分成了兩個部分,只是治療 鍵作爲一個獨特的價值
  • 品牌 - 產品
  • 模型製造商 - 產品的型號名稱
  • WeightInKg - 產品的重量,四捨五入到最接近公斤
  • 價格 - 銷售該產品的價格爲2位小數(2DP)

和我有這個代碼來標記每行:

public WarehouseItem(String warehouseItem) { 
    String key, brand, model; 
    int weightInKG; 
    double price; 
    StringTokenizer strTok; 

    strTok = new StringTokenizer(warehouseItem); 
    try { 
    key = strTok.nextToken(); 
    brand = strTok.nextToken(); 
    model = strTok.nextToken(); 
    weightInKG = Integer.parseInt(strTok.nextToken()); 
    price = Double.valueOf(strTok.nextToken()); 
    } 
    catch (Exception e) { 
    throw new IllegalStateException("CSV row had invalid format"); 
    } 
} 

當我嘗試運行它時,我得到了CSV文件的IllegalStateException。

Exception in thread "main" java.lang.IllegalStateException: CSV row had invalid format 
    at WarehouseItem.<init>(WarehouseItem.java:23) // throwing exception 
    at main.loadRecords(main.java:63) // records[numRows] = new WarehouseItem(warehouseItem); storing into array of objects 
    at main.main(main.java:26) // loadRecords(); calling the function which reads a line 
    at main.loadRecords(main.java:78) // main(null); recursing back to main 
    at main.main(main.java:26) // loadRecords(); calling the function which reads a line 

繼承人在CSV文件中的一行的例子:

沙發:6,Fremarc,豪華,101,1871.7

IM想,也許是因爲它具有關鍵ID作爲序列號? ?或者根本不重要?我會感到困惑和任何幫助,將不勝感激

+1

你能後你得到確切的錯誤?編輯:不,你不能。你可以把它從'try catch'塊中取出來,運行它,然後告訴我們你遇到了什麼錯誤? – nhgrif

+0

我現在得到一個NoSuchElementException現在當我在try-catch塊上刪除它時 –

+0

什麼是23行? 26號線? 63線? 78線? – nhgrif

回答

2

StringTokenizer是有點你很想你要做什麼(和在同一時間,並不複雜,如果你正在尋找解析雙引號確切的CSV格式)。

一種更簡單的方法是使用String.split方法,像這樣:

public WarehouseItem(String warehouseItem) { 
    String key, brand, model; 
    int weightInKG; 
    double price; 
    String[] tok = warehouseItem.split(","); 
    if (tok.length != 5) { 
     throw new IllegalStateException("Invalid CSV: not enough columns"); 
    } 
    key = tok[0]; 
    brand = tok[1]; 
    model = tok[2]; 
    weightInKG = Integer.parseInt(tok[3]); 
    price = Double.valueOf(tok[4]); 
    // Do something with the values you've got 
    ... 
} 
+0

這絕對是我要採取的方法。在我處理CSV的每種語言中,我總是尋找類似於Java的'String.split'方法的東西。 – nhgrif

+0

我只是用你的方式做事情,它的工作!成功將csv行存儲在一個對象數組中。謝謝 –

+0

嘿,當我嘗試打印它通過使用System.out.println(記錄[numRows])(記錄是WarehouseItem []和numRows只是一個計數器初始化爲0,並在讀完每行後增加1)我得到該行WarehouseItem @ b4e29b –

4

你可能最好關閉了圖書館。 CSV可以非常難以解析。看看OpenCSV:

http://opencsv.sourceforge.net/

CSVParser parser = new CSVParser(); 
String[] fields = parser.parseLine(line); 
+0

這比String.split()更好,尤其是在CSV中的一列是字符串類型並且可能包含空格或逗號的情況下。 –