java - 如何使用 Univocity 例程验证 CSV header ?

标签 java csv parsing univocity

当我迭代 Java bean 时,我将 Univocity CSV 解析器与例程一起使用。有没有办法验证 CSV header ?当我编辑 CSV 并添加无效 header 时,它只是插入给定的 bean null 而没有任何错误。

模型类:

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

解析器:

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

最佳答案

图书馆的作者在这里。 BeanListProcessor 有一个 strictHeaderValidationEnabled 属性,您可以将其设置为 true 以确保您的类中的所有 header 都存在于输入中。

在这种情况下,您不能使用 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);

希望这对您有所帮助。

关于java - 如何使用 Univocity 例程验证 CSV header ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52715984/

相关文章:

java - 整数对象在方法内正确实例化但返回 null

java - 与系统时间比较后程序无限期执行

javascript - 在 .csv 文件中写入度数符号

c - 从 Gem 覆盖 Ruby 的基本 C 代码

java - 如果我的实体包含对象 Libro,如何创建一个对 id_libro 进行计数的查询

java - jna加载库

linux - 使用 Qt Creator 绘制 csv 文件图表

postgresql - 如何将数据导入postgres

node.js - Node CSV 拉解析器

java - hibernate 。 ClassicQueryTranslatorFactory 与 ASTQueryTranslatorFactory