2015-06-11 9 views
5

Sto utilizzando Jackson CSV per analizzare un file CSV in POJO. Il mio problema è che se una riga nel CSV ha troppe poche colonne, il parser non si lamenta e imposta semplicemente il resto dei campi su null.Jackson CSV colonne mancanti

codice di analisi:

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

classe di dati:

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

Se io analizzare un file come il seguente, non si verificano errori, anche se il record di mezzo mancano due campi. Invece, Cognome e titolo diventano null

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

C'è una funzione per consentire che causerà questo errore invece?

+0

Mostra l'utilizzo di MappingIterator. –

+0

@LaurentiuL. aggiunto utilizzo di MappingIterator – rewolf

risposta

3

È possibile generare un'eccezione se stessi quando si genera il LinkedList uscita all'interno ciclo while:

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

Sì, grazie. So che potrei farlo, ma speravo che la biblioteca potesse effettivamente controllarlo in fase di analisi, come succede quando ci sono troppi campi. – rewolf

+0

Non ho trovato alcuna opzione che è possibile passare per rendere il parser rigoroso. Penso che non ci possa essere uno –

+1

@rewolf sarebbe stato utile avere un CsvParser.Feature che è possibile abilitare su CsvMapper. È possibile aggiungere un suggerimento su github –

2

vorrei suggerire la presentazione di una RFE per issue tracker, per qualcosa di simile CsvParser.Feature.REQUIRE_ALL_COLUMNS: se abilitato, parser getterebbe un'eccezione per indicare che mancano una o più colonne previste. Questa mi sembra un'utile aggiunta.

+1

Problema creato su Github https://github.com/FasterXML/jackson-dataformat-csv/issues/113 – rewolf