2016-11-06 37 views
1

我解析的文件之一包含兩部分,我需要將其邏輯分成兩個不同的bean。我發現MultiBeanListProcessor是一個很好的方法。我使用test example 14作爲我的代碼的源代碼。Univocity - 是否可以使用MultiBeanListProcessor進行迭代?

考慮以下配置:

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?

回答

1

目前,你唯一的選擇是使用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; 
    } 
} 

希望這有助於

+0

感謝您的例子中使用似乎並沒有編譯快速response.The的工藝方法。想自己寫一個流程方法的實現嗎? 最後但並非最不重要,在我的實際應用程序中,我有兩個bean,它們都實現了一個接口。我使用MultiBeanListProcessor來加載這些以接口表示的類。 'MultiBeanListProcessor processor = new MultiBeanListProcessor(classArray);' 'Class [] classArray'由Person和Adress bean組成,但是作爲一個接口。給定這個用例,我仍然可以使用beanProcessed方法嗎? –

+0

想通了,我正在做一些菜鳥犯的錯誤。現在它的工作,我可以申請我的邏輯每行。 –

相關問題