2015-06-11 13 views
5

Tôi đang sử dụng Jackson CSV để phân tích tệp CSV thành các POJO. Vấn đề của tôi là nếu một hàng trong CSV có quá ít cột, trình phân tích cú pháp không phàn nàn và chỉ đặt phần còn lại của trường thành null.Các cột bị thiếu trong CSV của CSV

đang Phân tích:

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

lớp dữ liệu:

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

Nếu tôi phân tích một tập tin như sau, không có lỗi xảy ra mặc dù kỷ lục giữa thiếu hai trường. Thay vào đó, LastName và Title trở thành null

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

Có tính năng nào để kích hoạt lỗi này thay vào đó không?

+0

Hiển thị mức sử dụng Trình ánh xạ của bạn. –

+0

@LaurentiuL. thêm cách sử dụng MappingIterator – rewolf

Trả lời

3

Bạn có thể ném một ngoại lệ chính mình khi bạn xây dựng LinkedList đầu ra bên vòng lặp 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

Có, cảm ơn. Tôi biết tôi có thể làm điều đó, nhưng tôi đã hy vọng rằng thư viện sẽ thực sự kiểm tra điều này tại phân tích thời gian, như nó có khi có quá nhiều lĩnh vực. – rewolf

+0

Tôi không tìm thấy bất kỳ tùy chọn nào bạn có thể vượt qua để làm cho trình phân tích cú pháp nghiêm ngặt. Tôi nghĩ rằng có thể không có một –

+1

@rewolf sẽ hữu ích khi có một CsvParser.Feature mà bạn có thể bật trên CsvMapper. Bạn có thể thêm một gợi ý về github –

2

tôi sẽ đề nghị nộp một RFE cho theo dõi vấn đề, đối với một cái gì đó giống như CsvParser.Feature.REQUIRE_ALL_COLUMNS: nếu được kích hoạt, phân tích cú pháp sẽ ném một ngoại lệ cho biết một hoặc nhiều cột được mong đợi bị thiếu. Điều này nghe giống như một bổ sung hữu ích cho tôi.

+1

Đã tạo sự cố trên Github https://github.com/FasterXML/jackson-dataformat-csv/issues/113 – rewolf

Các vấn đề liên quan