Java 为什么我需要结合BeanListProcessor调用parseLine两次
我正在使用Univocity(2.8.2)解析器逐行解析CSV。 它迫使我调用parseLine(“”)两次来设置标题 我已尝试在CSVParserSettings上设置标题Java 为什么我需要结合BeanListProcessor调用parseLine两次,java,univocity,Java,Univocity,我正在使用Univocity(2.8.2)解析器逐行解析CSV。 它迫使我调用parseLine(“”)两次来设置标题 我已尝试在CSVParserSettings上设置标题 String[]headers={“name”,“age”}; setHeaders(headers); 当我省略第二条“parser.parseLine(“name,age”)”语句时,这会导致奇怪的行为 公共类ParserTest{ 公共静态AB类{ @已解析(field=“name”) 私有字符串名称; @已解析(
String[]headers={“name”,“age”};
setHeaders(headers);
当我省略第二条“parser.parseLine(“name,age”)”语句时,这会导致奇怪的行为
公共类ParserTest{
公共静态AB类{
@已解析(field=“name”)
私有字符串名称;
@已解析(field=“age”)
私人整数年龄;
公共AB(){}
}
@试验
public void testcaseinsensitivebooleananconversion(){
CsvParserSettings parserSettings=新的CsvParserSettings();
BeanListProcessor beanProcessor=新的BeanListProcessor(AB.class);
parserSettings.setHeaderExtractionEnabled(true);
设置处理器(beanProcessor);
最终CsvParser解析器=新CsvParser(parserSettings);
parser.parseLine(“姓名、年龄”);
parser.parseLine(“name,age”);//这不是必需的
parser.parseLine(“dave,21”);
parser.parseLine(“jan,23”);
parser.parseLine(“eddy,25”);
listbeans=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不会这样工作
@试验
public void testcaseinsensitivebooleananconversion(){
CsvParserSettings parserSettings=新的CsvParserSettings();
BeanListProcessor beanProcessor=新的BeanListProcessor(AB.class);
parserSettings.setHeaderExtractionEnabled(false);
设置处理器(beanProcessor);
最终字符串[]头={“名称”,“年龄”};
setHeaders(headers);
最终CsvParser解析器=新CsvParser(parserSettings);
parser.parseLine(“dave,21”);
parser.parseLine(“jan,23”);
parser.parseLine(“eddy,25”);
listbeans=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);
}
我猜,但可能是因为您告诉解析器将第一行视为标题行,然后将其余的行发送给处理器,处理器将看到的第一行(即第二行)视为标题,因此它可以按名称映射字段。不要调用setHeaderExtractionEnabled(true)。我希望它是真的;我将“parserSettings.setHeaderExtractionEnabled(true);”设置为false,并删除了一行重复的“parser.parserLine(“name,age”)”;它仍然不起作用。