2010-03-09 9 views
0

Im ayant du mal à lire à partir d'un fichier CSVCSV lecture en 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"; 

    } 

Le code ci-dessus ne fonctionnera pas sur l'exemple fichier

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

Cependant, cela fonctionne très bien quand il y a une virgule à La fin de la ligne. (hvaing une virgule ici n'est pas une option)

Que puis-je faire pour que cela fonctionne? Il doit être de faire avec mon délimiteur je pense que

Merci

+0

Non lié, mais si ces fichiers peuvent provenir de sources externes, vous pouvez désinfecter les entrées. avant d'exécuter ce SQL. – Uri

Répondre

2

Obtenez-vous un NoSuchElementException de la ligne suivante?

carimage = dataSetScan.next(); 

Si oui, vous avez juste besoin d'envelopper que d'un chèque de hasNext et effectuer une vérification nulle lorsque vous construisez votre chaîne.

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

...

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

+1 pour me battre à la poste – Pops

+0

Merci l'homme, ça marche super !! – user195257

9

Je recommande de ne pas utiliser votre propre analyseur pour CSV. CSV est étonnamment complexe avec de petits pièges partout.

Par exemple, au format CSV, il est légal de citer une valeur de colonne avec une virgule dans il

3 colonnes dans ce fichier

abc,"value1,value2",def 

Je recommande cette bibliothèque java, il est très facile à utilisation.

http://opencsv.sourceforge.net/

EDIT - Mai 2013

Depuis la rédaction de ce post, je l'ai passé à cette bibliothèque, qui prend en charge le "standard" CSV mieux et est activement développé.

http://supercsv.sourceforge.net/

+0

+1 pour ne pas avoir réinventé la roue. –

0

Je recommande de tester chaque jeton avant de l'insérer,

Mais pour répondre à votre question, ajouter une condition if avant le dernier dataSetScan.next() appel comme suit:

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