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;
    }
}

希望对您有所帮助