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

我尝试在CSVParserSettings上设置标题。

        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()语句用作标题,但我想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);
    }

09-11 18:08