Univocity - 是否可以使用 MultiBeanListProcessor 进行迭代?
Univocity - Is it possible to iterate using the MultiBeanListProcessor?
我正在解析的一个文件由两部分组成,我需要将它们逻辑上分成两个不同的 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());
}
}
}
这真的很好用。
不幸的是,输入文件太大,无法加载到内存中,我需要迭代而不是一次解析所有文件。在之前的提问 中给出了如何迭代每个 bean 的答案。然而,我没有设法将此 logic/code 应用于此用例。
如何在使用 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;
}
}
希望对您有所帮助
我正在解析的一个文件由两部分组成,我需要将它们逻辑上分成两个不同的 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());
}
}
}
这真的很好用。
不幸的是,输入文件太大,无法加载到内存中,我需要迭代而不是一次解析所有文件。在之前的提问
如何在使用 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;
}
}
希望对您有所帮助