2016-11-06 5 views
1

내가 파싱 할 파일 중 하나는 두 개의 다른 콩으로 논리적으로 분할해야하는 두 부분으로 구성됩니다. 나는 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에서 각 빈에 대해 반복하는 방법에 대한 대답이있었습니다. 그러나이 논리/코드를이 사용 사례에 적용 할 수 없었습니다.

MultiBeanListProcessor를 사용할 때 각 bean을 반복하는 방법은 무엇입니까?

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

빈의 새로운 인스턴스가 될 때마다 :

답변

1

현재 당신이 가지고있는 유일한 옵션은 메소드에 대한 구현을 제공하는 추상적이고 당신이 필요합니다 (대신 MultiBeanListProcessor에) MultiBeanProcessor을 사용하는 것입니다 이 메소드가 호출되고 필요에 따라 오브젝트 인스턴스를 처리 할 수 ​​있습니다. 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; 
    } 
} 

희망이 컴파일하지 않는 것 귀하의 예제에서 사용되는 빠른 response.The의 처리 방법에 대한

+0

감사를하는 데 도움이됩니다. 프로세스 메서드 구현을 직접 작성하는 아이디어입니까? 마지막으로, 실제 응용 프로그램에는 두 개의 bean이 있으며 둘 다 인터페이스를 구현합니다. MultiBeanListProcessor를 사용하여 인터페이스로 표시된 클래스의 배열을로드했습니다. 'MultiBeanListProcessor processor = new MultiBeanListProcessor (classArray);' '클래스 [] classArray'는 Person과 Adress Bean으로 구성되지만 인터페이스로 구성됩니다. 이 유스 케이스에 따라 beanProcessed 메소드를 계속 사용할 수 있습니까? –

+0

그걸 알아 냈어, 신참 캐스팅 실수를 저질렀다. 그것의 지금 일하고 나는 선 당 나의 논리를 적용 할 수있다. –

관련 문제