gpt4 book ai didi

java - Univocity - 是否可以使用 MultiBeanListProcessor 进行迭代?

转载 作者:行者123 更新时间:2023-11-30 07:03:52 26 4
gpt4 key购买 nike

我正在解析的文件之一由两部分组成,我需要将它们逻辑上分成两个不同的 bean。我发现 MultiBeanListProcessor 是实现此目的的好方法。我用过test example 14作为我的代码的来源。

给定以下配置:

public class Sample {

public static void main(String[] args) throws IOException {
CsvParserSettings parserSettings = new CsvParserSettings();
parserSettings.getFormat().setDelimiter('|');
MultiBeanListProcessor processor = new MultiBeanListProcessor(Person.class, Address.class);
String[] headers = new String[7];
headers[0] = "id";
headers[1] = "firstName";
headers[2] = "lastName";
headers[3] = "city";
headers[4] = "streetName";
headers[5] = "houseNo";
headers[6] = "houseAdd";
String[] selectedFields = new String[5];
selectedFields[0] = "firstName";
selectedFields[1] = "lastName";
selectedFields[2] = "city";
selectedFields[3] = "streetName";
selectedFields[4] = "houseAdd";
parserSettings.setHeaders(headers);
parserSettings.selectFields(selectedFields);
parserSettings.setProcessor(processor);
parserSettings.setColumnReorderingEnabled(false);
CsvParser parser = new CsvParser(parserSettings);
parser.parse(new FileReader("src/main/resources/input.csv"));

List<Person> persons = processor.getBeans(Person.class);
List<Address> addresses = processor.getBeans(Address.class);

for (Person person : persons) {
System.out.println(person.getFirstName());
}

for (Address address : addresses) {
System.out.println(address.getCity());
}
}
}

这确实非常有效。

不幸的是,输入文件太大而无法加载到内存中,我需要迭代而不是一次性解析所有文件。在之前问过的question给出了如何迭代每个 bean 的答案。然而,我没有设法将此逻辑/代码应用于此用例。

使用 MultiBeanListProcessor 时如何迭代每个 bean?

最佳答案

目前,您唯一的选择是使用 MultiBeanProcessor(而不是 MultiBeanListProcessor),它是抽象的,需要您提供方法的实现:

public void beanProcessed(Class<?> beanType, Object beanInstance, C context){
// your code here
}

每次创建一个新的 bean 实例时,都会调用此方法,您可以根据需要处理对象实例。如果需要,您可以使用 context 对象来获取有关哪个记录源自对象实例的信息。一个非常简单的实现可能是:

private Person person;
private Address address;

public void beanProcessed(Class<?> beanType, Object beanInstance, C context){
if(beanType == Person.class){
person = (Person) beanInstance;
}
if(beanType == Address.class){
address = (Address) beanInstance;
}
if(person != null && address != null){
//got all beans from a row, process them
process(person, address);

//clear up until you get the instances produced for the next record.
person = null;
address = null;
}
}

希望这有帮助

关于java - Univocity - 是否可以使用 MultiBeanListProcessor 进行迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40454374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com