2011-10-10 14 views
6

मैं आयात StringTokenizer का उपयोग कर Arraylist को 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 काम करता है समझ में नहीं आता, अगर मैं रखने के तीन चर (docNumber, note प्रारंभ क्योंकि और index) 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

ओपनसीवी लाइब्रेरी सीएसवी फाइलों को बहुत आसान बनाता है, स्वयं को कोड करने की आवश्यकता नहीं है। – Pete855217

उत्तर

18

ऐसा लगता है कि आपकी इनपुट फ़ाइल की कुछ पंक्तियों में कम से कम 3 अल्पविराम से अलग फ़ील्ड हैं। आपको हमेशा यह जांचना चाहिए कि टोकननाइज़र के पास अधिक टोकन (स्ट्रिंगटोकनाइज़र.hasMoreTokens) हैं, जब तक कि आप 100% सुनिश्चित न हों कि आपका इनपुट सही है।

सीएसवी फाइलों का सही पार्सिंग इतना छोटा काम नहीं है। लाइब्रेरी का उपयोग क्यों न करें जो इसे बहुत अच्छी तरह से कर सकता है - http://opencsv.sourceforge.net/?

+0

आप ठीक कह रहे हैं, समस्या सीएसवी फ़ाइल में है! ओपनसीएसवी के लिए धन्यवाद, मैं इसे भी आजमाउंगा :-) – gaffcz

+0

opencsv के लिए जाएं। बस कल्पना करें, कोड के साथ क्या होगा, आप उपयोग करने वाले हैं, अगर 'नोट' फ़ील्ड में अल्पविराम होगा। एक और सवाल @stackoverflow? :) – aav

+0

आपकी सलाह आखिरकार सबसे सुविधाजनक है, बहुत बहुत धन्यवाद! (और चिंता न करें, अगले प्रश्न जल्द ही आ रहे हैं: डी – gaffcz

2

ऐसा लगता है कि आपका कोड उस रेखा पर जा रहा है जो टोकनिज़र केवल 3 के बजाय 1 भाग में टूट रहा है। क्या गायब डेटा के साथ लाइनें संभव है? यदि ऐसा है, तो आपको इसे संभालने की आवश्यकता है।

+0

आप सही हैं, समस्या सीएसवी फ़ाइल में है! धन्यवाद :-) – 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

धन्यवाद, यह है! सीएसवी फ़ाइल में हर जगह तीन कॉलम नहीं हैं .. अब मैं आपके कोड का उपयोग करने की कोशिश कर रहा हूं :-) – gaffcz

2

आप hasMoreTokens() विधि का उपयोग कर अपने टोकन जाँच करने के लिए सक्षम होना चाहिए। यदि यह झूठा लौटाता है, तो यह संभव है कि आपके द्वारा पढ़ी गई रेखा में कुछ भी शामिल न हो (यानी, एक खाली स्ट्रिंग)।

स्ट्रिंग.split() विधि का उपयोग करना बेहतर होगा - अगर मुझे गलत नहीं है, तो स्ट्रिंगटोकनाइज़र क्लास को बहिष्कृत करने की योजना थी।

संबंधित मुद्दे