为什么我需要结合 BeanListProcessor 调用 parseLine 两次
Why do I need to call parseLine twice in combination with a BeanListProcessor
我正在使用 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);
}
我正在使用 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);
}