Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我需要结合BeanListProcessor调用parseLine两次_Java_Univocity - Fatal编程技术网

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

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”) 私有字符串名称; @已解析(

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

我已尝试在CSVParserSettings上设置标题

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”)”;它仍然不起作用。