java - 为什么我需要结合 BeanListProcessor 调用 parseLine 两次

标签 java univocity

我正在使用 Univocity (2.8.2) 解析器逐行解析 CSV。 它迫使我调用 parseLine("") 两次来设置 header 。

我尝试在 CSVParserSettings 上设置 header 。

        String[] headers = {"name","age"};
        parserSettings.setHeaders(headers);

当我省略第二个“parser.parseLine(“name,age”)”语句时,这会导致奇怪的行为。

public class ParserTest {
    public static class AB {
        @Parsed(field = "name")
        private String name;

        @Parsed(field = "age")
        private Integer age;

        public AB() {   }
    }

    @Test
    public void testCaseInsensitiveBooleanConversion() {
        CsvParserSettings parserSettings = new CsvParserSettings();
        BeanListProcessor<AB> beanProcessor = new BeanListProcessor<>(AB.class);
        parserSettings.setHeaderExtractionEnabled(true);
        parserSettings.setProcessor(beanProcessor);

        final CsvParser parser = new CsvParser(parserSettings);
        parser.parseLine("name,age");
        parser.parseLine("name,age"); // This shoud not be nescessary

        parser.parseLine("dave,21");
        parser.parseLine("jan,23");
        parser.parseLine("eddy,25");

        List<AB> beans = beanProcessor.getBeans();

        Assert.assertEquals("dave", beans.get(0).name);
        Assert.assertEquals(Integer.valueOf(21), beans.get(0).age);

        Assert.assertEquals("jan", beans.get(1).name);
        Assert.assertEquals(Integer.valueOf(23), beans.get(1).age);

        Assert.assertEquals("eddy", beans.get(2).name);
        Assert.assertEquals(Integer.valueOf(25), beans.get(2).age);
    }
}

正如您从测试中看到的,我调用了“parser.parseLine(“name,age”)”两次。如果我不这样做,解析器就不会填充 bean。

最佳答案

我想我找到了解决方案。我本来想使用第一个 parseLine() 语句作为 header ,但我猜 Univocity 不会那样工作。


    @Test
    public void testCaseInsensitiveBooleanConversion() {
        CsvParserSettings parserSettings = new CsvParserSettings();
        BeanListProcessor<AB> beanProcessor = new BeanListProcessor<>(AB.class);
        parserSettings.setHeaderExtractionEnabled(false);
        parserSettings.setProcessor(beanProcessor);
        final String[] headers = {"name","age"};
        parserSettings.setHeaders(headers);

        final CsvParser parser = new CsvParser(parserSettings);
        parser.parseLine("dave,21");
        parser.parseLine("jan,23");
        parser.parseLine("eddy,25");

        List<AB> beans = beanProcessor.getBeans();

        Assert.assertEquals("dave", beans.get(0).name);
        Assert.assertEquals(Integer.valueOf(21), beans.get(0).age);

        Assert.assertEquals("jan", beans.get(1).name);
        Assert.assertEquals(Integer.valueOf(23), beans.get(1).age);

        Assert.assertEquals("eddy", beans.get(2).name);
        Assert.assertEquals(Integer.valueOf(25), beans.get(2).age);
    }

关于java - 为什么我需要结合 BeanListProcessor 调用 parseLine 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57341798/

相关文章:

java - Univocity - 是否可以将文件解析为运行时生成的 bean/类?

java - uniVocity 不会将第一列解析为 bean

java - univocity - 如何从选定的字符解析字符串

java - 将 clojure/java.jmx 暴露给监控工具

java - Smack MamManager 在获取存档消息时抛出异常

java - 正则表达式 : search strings extending on exact number of lines

Java - 操作顺序 - 在一行中使用两个赋值运算符

java - CSVRecordReader 和 CSV 行末尾未终止的引用字段

java - Univocity 解析器 - 处理具有奇怪结构的行

java - 批处理文件执行可以单步执行序列而不完成 java 进程吗?