2015-06-11 7 views
5

मैं पीओजेओ में एक CSV फ़ाइल को पार्स करने के लिए Jackson CSV का उपयोग कर रहा हूं। मेरी समस्या यह है कि यदि सीएसवी में एक पंक्ति में बहुत कम कॉलम हैं, तो पार्सर शिकायत नहीं करता है और बाकी फ़ील्ड को शून्य में सेट करता है।जैक्सन सीएसवी गायब कॉलम

पार्स कोड:

CsvMapper csvMapper = new CsvMapper(); 
    csvMapper.addMixInAnnotations(Person.class, PersonCsvMixin.class); 
    CsvSchema schema = csvMapper.schemaFor(Person.class).withHeader(); 
    MappingIterator<Person> it = csvMapper.reader(dataClass).with(schema).readValues(csv); 
    LinkedList<Person> output = new LinkedList<>(); 

    while(it.hasNext()) { 
     output.push(it.next()); 
    } 

Mixin:

import com.fasterxml.jackson.annotation.*; 

@JsonPropertyOrder(value = { "FirstName", "LastName", "Title"}) 
public abstract class Person { 
    @JsonProperty("LastName") 
    public abstract String getLastName(); 
    @JsonProperty("FirstName") 
    public abstract String getFirstName(); 
    @JsonProperty("Title") 
    public abstract String getTitle(); 
} 

डाटा वर्ग:

public class OfficespaceInputEmployee implements Serializable{ 
    protected String firstName; 
    protected String lastName; 
    protected String title; 
    // .. getters and setters 
} 

अगर मैं निम्नलिखित की तरह एक फ़ाइल को पार्स, कोई त्रुटि भी बीच रिकॉर्ड हालांकि पाए जाते हैं दो फ़ील्ड गुम है इसके बजाय, अंतिम नाम और शीर्षक बन null

"FirstName", "LastName", "Title" 
"John", "Smith", "Mr" 
"Mary" 
"Peter", "Jones", "Dr" 

वहाँ कि सक्षम करने के लिए इस बजाय त्रुटि के कारण होगा एक विशेषता है?

+0

अपना मानचित्रण इटरेटर उपयोग दिखाएं। –

+0

@LaurentiuL। जोड़ा मैपिंग इटरेटर उपयोग – rewolf

उत्तर

3

आप एक अपवाद अपने आप को जब तुम जबकि पाश अंदर उत्पादन LinkedList निर्माण फेंक कर सकते हैं:

while(it.hasNext()) { 
    Person line = it.next(); 
    //call a method which checks that all values have been set 
    if (thatMethodReturnsTrue){ 
     output.push(line); 
    } else{ 
     throw SomeException(); 
    } 
} 
+1

हाँ, धन्यवाद। मुझे पता है कि मैं ऐसा कर सकता था, लेकिन मैं उम्मीद कर रहा था कि लाइब्रेरी वास्तव में इसे पार्स-टाइम पर जांच करेगी, क्योंकि जब बहुत सारे क्षेत्र होते हैं तो ऐसा होता है। – rewolf

+0

मुझे कोई विकल्प नहीं मिला है जिसे आप पारसर को सख्त बनाने के लिए पास कर सकते हैं। मुझे लगता है कि एक –

+1

नहीं हो सकता है @rewolf एक सीएसवीपरसर के लिए उपयोगी होता। फीचर जिसे आप CsvMapper पर सक्षम कर सकते हैं। आप github –

2

मैं इस मुद्दे पर नजर के लिए एक RFE दाखिल सुझाव है, CsvParser.Feature.REQUIRE_ALL_COLUMNS की तरह कुछ के लिए: यदि सक्षम, पार्सर फेंक यह इंगित करने के लिए एक अपवाद है कि एक या अधिक अपेक्षित कॉलम गुम हैं। यह मेरे लिए उपयोगी जोड़ जैसा लगता है।

+1

Github https://github.com/FasterXML/jackson-dataformat-csv/issues/113 पर समस्या बनाई गई – rewolf