1

I am parsing a CSV line by line using the Univocity (2.8.2) parser. It forces me to call parseLine("") twice to set the header.

I have tried setting the header on the CSVParserSettings.

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

This results in weird behavior when I leave out the second "parser.parseLine("name,age")" statement.

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

As you can see from the Test, I am calling "parser.parseLine("name,age")" twice. If I do not do this the parser does not populate the bean.

Dave Weernink
  • 91
  • 1
  • 9
  • 1
    I'm guessing, but probably because you told the parser to treat the first line as a header line and then send the rest of the lines to the processor, and the processor treats the first line it sees (i.e. the second line) as a header, so it can map the fields by name. Don't call `setHeaderExtractionEnabled(true)`. – Andreas Aug 03 '19 at 22:24
  • I wish it was true; I set "parserSettings.setHeaderExtractionEnabled(true);" to false, and removed one duplicate line "parser.parseLine("name,age")"; It still doesn't work. – Dave Weernink Aug 03 '19 at 23:20

1 Answers1

1

I think I found the solution. I would have liked to use the first parseLine() statement as a header, but I guess Univocity doesn't work like that.


    @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);
    }
Dave Weernink
  • 91
  • 1
  • 9