2015-06-11 8 views
5

Ich verwende Jackson CSV, um eine CSV-Datei in POJOs zu analysieren. Mein Problem ist, dass, wenn eine Zeile in der CSV zu wenig Spalten hat, der Parser sich nicht beschwert und nur den Rest der Felder auf null setzt.Jackson CSV fehlende Spalten

Parsing-Code:

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(); 
} 

Datenklasse:

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

Wenn ich eine Datei wie folgt analysieren, treten keine Fehler auf, obwohl der mittlere Rekord fehlen zwei Felder. Stattdessen Name und Titel werden null

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

Gibt es ein Merkmal, das zu ermöglichen, führt dies stattdessen auf Fehler?

+0

Zeigen Sie Ihre MappingIterator-Nutzung. –

+0

@LaurentiuL. MappingIterator Verwendung hinzugefügt – rewolf

Antwort

3

Sie eine Ausnahme selbst werfen können, wenn Sie die Ausgabe LinkedList innerhalb die while-Schleife bauen: Ich für Issue Tracker einen RFE Einreichung vorschlagen würde

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

Ja, danke. Ich weiß, dass ich das tun könnte, aber ich hatte gehofft, dass die Bibliothek das zur Zeit des Parsens überprüfen würde, wie wenn es zu viele Felder gibt. – rewolf

+0

Ich habe keine Option gefunden, die Sie übergeben können, um den Parser strikt zu machen. Ich denke, es gibt möglicherweise keine –

+1

@rewolf wäre nützlich gewesen, um eine CsvParser.Feature, die Sie auf dem CsvMapper aktivieren können. Sie können einen Vorschlag auf Github –

2

, für so etwas wie CsvParser.Feature.REQUIRE_ALL_COLUMNS: wenn aktiviert, würde Parser werfen eine Ausnahme, um anzuzeigen, dass eine oder mehrere der erwarteten Spalten fehlen. Das klingt wie eine nützliche Ergänzung für mich.

+1

Erstellt Ausgabe auf Github https://github.com/FasterXML/jackson-dataformat-csv/issues/113 – rewolf

Verwandte Themen