Как проверить заголовки CSV, используя подпрограммы Univocity? - PullRequest
0 голосов
/ 09 октября 2018

Я использую синтаксический анализатор Univocity CSV с подпрограммами, когда перебираю Java-бины.Есть ли способ проверить заголовок CSV?Когда я редактирую CSV и добавляю недопустимый заголовок, он просто вставляется в данный ноль компонента без ошибок.

Класс модели:

public class Customer {

@Format(formats ="yyyy-MM-dd")
@Parsed(field="C_DAY")
private Date day;

@Parsed(field="C_ID")
private Long id;

@Parsed(field="C_TYPE")
private String type;

@Format(formats ="yyyy-MM-dd")
@Parsed(field="C_ORIGIN_DATE")
private Date originDate;

@Format(formats ="yyyy-MM-dd")
@Parsed(field="C_REL_DATE")
private Date relDate;

@Parsed(field="C_LEGAL_ID")
private String legalId;

@Parsed(field="C_NAME")
private String name;}

Parser:

    @Autowired
private CustomerDAO dao;

public void parse(File file) throws IOException, SQLException, CustomerValidationException, ParseException {
    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");
    parserSettings.setHeaderExtractionEnabled(false);
    CsvRoutines routines = new CsvRoutines(parserSettings);
    List<Customer> customers = new ArrayList<>();
    java.util.Date stamp = getTimestamp(file);
    dao.checkTimestampDate(stamp);


    for (Customer customer : routines.iterate(Customer.class, file, "UTF-8")) {
        validateFileDateWithFileName(stamp, customer.getDay());
        validateCustomer(customer);
        customers.add(customer);
    }
    dao.save(customers);
}

1 Ответ

0 голосов
/ 09 октября 2018

Автор библиотеки здесь.У BeanListProcessor есть свойство strictHeaderValidationEnabled, которое можно установить на true, чтобы обеспечить наличие всех заголовков в вашем классе во входных данных.

Вы просто не можете использовать CsvRoutines в этом случае, так какКласс реализует вспомогательные методы, которые используют свои собственные внутренние процессоры строк, поэтому ваши будут игнорироваться.Попробуйте этот код:

    CsvParserSettings parserSettings = new CsvParserSettings();
    parserSettings.getFormat().setLineSeparator("\n");

    final List<Customer> customers = new ArrayList<>();
    final java.util.Date stamp = getTimestamp(file);
    dao.checkTimestampDate(stamp);

    parserSettings.setProcessor(new BeanProcessor<Customer>() {
        @Override
        public void beanProcessed(Customer customer, ParsingContext context) {
            validateFileDateWithFileName(stamp, customer.getDay());
            validateCustomer(customer);
            customers.add(customer);
        }
    });

    new CsvParser(parserSettings).parse(file, "UTF-8");

    dao.save(customers);

Надеюсь, это поможет.

...