首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Univocity例程验证CSV标头?

如何使用Univocity例程验证CSV标头?
EN

Stack Overflow用户
提问于 2018-10-09 07:56:20
回答 2查看 1.3K关注 0票数 3

当我在Java上迭代时,我使用Univocity解析器和例程。有什么方法来验证CSV头吗?当我编辑CSV并添加无效的标头时,它只是插入到给定的bean null中,而没有任何错误。

模型类:

代码语言:javascript
复制
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:

代码语言:javascript
复制
    @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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-09 17:44:32

这里图书馆的作者。BeanListProcessor具有一个可以设置为truestrictHeaderValidationEnabled属性,以确保类中的所有标头都存在于输入中。

在这种情况下,您不能使用CsvRoutines,因为该类实现了使用自己的内部行处理器的方便方法,因此您的类将被忽略。试试下面的代码:

代码语言:javascript
复制
    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);

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2020-11-03 10:42:15

根据杰罗尼莫·巴克斯的回答。

如果您在bean上有@Header注释,或者知道确切的头,但仍然需要setHeaderExtractionEnabled(true)

代码语言:javascript
复制
public <T> List<T> parse(File file, Class<T> beanType, char delimiter, Charset charset) {
    String[] headers = beanType.getDeclaredAnnotation(Headers.class).sequence(); // or other source

    CsvParserSettings parserSettings = Csv.parseRfc4180(); // or some other
    parserSettings.detectFormatAutomatically(delimiter);
    parserSettings.setHeaderExtractionEnabled(true);

    // initialize new processor (stateful, should not be reused! See implementation of parseAll)
    BeanListProcessor<T> processor= new BeanListProcessor<>();
    processor.setStrictHeaderValidationEnabled(true);
    parserSettings.setProcessor(processor);

    CsvParser csvParser = new CsvParser(parserSettings);

    csvParser.parse(file, charset);

    // header validation
    String[] headersParsed = processor.getHeaders();
    if (!Arrays.equals(headers, headersParsed)) {
        String message = String.format("Header validation failed. Expected: %s, but was: %s",
            Arrays.toString(headers), Arrays.toString(headersParsed));
        throw new DataProcessingException(message);
    }

    return beanListProcessor.getBeans();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52715984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档