2010-03-09 99 views
0
有麻煩

我可是從一個CSV閱讀文件CSV在java中讀取

final String DELIMITER = ","; 
    Scanner fileScan = null; 
    Scanner dataSetScan = null; 
    String dataSet = null; 
    String sql = ""; 
    File users = new File("user.txt"); 
    String nickname = ""; 
    String lastname = ""; 
    String firstname = ""; 
    String cartype = ""; 
    String personimage = ""; 
    String carimage = ""; 
    int user_id = 0; 

    try { 
     fileScan = new Scanner(users); 
    } catch (Exception e) { 
     System.out.println(e); 
    } 

while(fileScan.hasNext()){ 
     dataSet = fileScan.nextLine(); 
     dataSetScan = new Scanner(dataSet); 
     dataSetScan.useDelimiter(DELIMITER); 

     nickname = dataSetScan.next(); 
     lastname = dataSetScan.next(); 
     firstname = dataSetScan.next(); 
     cartype = dataSetScan.next(); 
     personimage = dataSetScan.next(); 
     carimage = dataSetScan.next(); 

     sql += "INSERT INTO users VALUES ("; 
     sql += user_id++ + ", "; 
     sql += "'" + nickname + "', "; 
     sql += "'" + lastname + "', "; 
     sql += "'" + firstname + "', "; 
     sql += "'" + cartype + "', "; 
     sql += "'" + personimage + "', "; 
     sql += "'" + carimage + "' "; 
     sql += ");\n"; 

    } 

上面的代碼不會在例如工作文件

alice,Wonder-Land,Alice,red Vauxhall Corsa,alice.jpg,alice_car.jpg 
bob,Kett,Robert,,, 
charlie,Carlos,Don,,, 

但是,它工作得很好時,有一個逗號在行結束。 (在這裏逗號不是選項)

我能做些什麼來完成這項工作?它必須與我的分隔符做我認爲

謝謝

+0

無關,但如果這些文件可能來自外部來源,您可能需要清理輸入執行該SQL之前。 – Uri 2010-03-09 16:12:13

回答

2

你從下面的行獲得一個NoSuchElementException?

carimage = dataSetScan.next(); 

如果是這樣,你只需要用hasNext檢查來包裝它,並在構建字符串時執行空檢查。

if(dataSetScanner.hasNext()){ 
    carimage = dataSetScan.next(); 
} 
else{ 
    carimage = null; 
} 

...

sql += carimage == null ? "NULL" : "'" + carimage + "' "; 
+0

+1打我的帖子 – Pops 2010-03-09 16:25:29

+0

謝謝你,這很好! – user195257 2010-03-09 16:25:30

9

我不會建議使用自己的CSV分析器。 CSV出奇地複雜,無處不在。

例如,CSV,它是合法的,用逗號它

3列在這個文件中

abc,"value1,value2",def 

我建議這個庫的Java引用列值,這是很容易使用。

http://opencsv.sourceforge.net/

編輯 - 2013年5月

因爲寫這篇文章,我已經切換到這個庫,它支持CSV「標準」更好,並正在積極發展。

http://supercsv.sourceforge.net/

+0

+1不重新發明車輪。 – 2010-03-09 16:37:00

0

我會建議插入之前測試每個令牌,

但回答你的問題,如果條件最後dataSetScan.next()調用之前添加像這樣:

 if (dataSetScan.hasNext()){ 
      carimage = dataSetScan.next(); 
     }