2010-03-09 2 views
0

Im возникают проблемы чтения из 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,,, 

Однако, это работает очень хорошо, когда есть запятая в конец линии. (haing запятая здесь не вариант)

Что я могу сделать, чтобы сделать эту работу? Это должно быть связано с моей разделители я думаю

Спасибо

+0

Несвязанный, но если эти файлы могут быть получены из внешних источников, вы можете захотеть дезинфицировать входы перед выполнением этого SQL. – Uri

ответ

2

Вы получаете NoSuchElementException из следующей строки?

carimage = dataSetScan.next(); 

Если это так, вам просто нужно обернуть это с помощью проверки hasNext и выполнить нулевую проверку при построении строки.

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

...

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

+1 за избиение меня до должности – Pops

+0

Спасибо, человек, который отлично работает !! – user195257

9

Я бы не рекомендовал использовать собственный парсер CSV. CSV на удивление сложный, с небольшими ошибками во всем мире.

Например, в CSV, это законно процитировать значение столбца с запятой в нем

3 столбцов в этом файле

abc,"value1,value2",def 

Я рекомендую эту библиотеку для Java, это очень легко использовать.

http://opencsv.sourceforge.net/

EDIT - май 2013

С момента написания этого поста, я перешел в эту библиотеку, которая поддерживает CSV «стандарт» лучше и активно развивается.

http://supercsv.sourceforge.net/

+0

+1 для того, чтобы не изобретать колесо. –

0

Я бы рекомендовал тестирование каждого маркера перед его установкой,

Но чтобы ответить на ваш вопрос, добавьте если условие до последнего dataSetScan.next() вызов например:

 if (dataSetScan.hasNext()){ 
      carimage = dataSetScan.next(); 
     } 
Смежные вопросы