2014-02-09 1 views
3

프로젝트의 경우 런타임 전에 열을 모르는 경우 CSV 파일을 처리해야합니다. CSV 파일은 완벽하게 유효합니다. 여러 파일에 대해 반복적으로 간단한 작업 만 수행하면됩니다. 필자는 열 값을 분석해야하므로 CSV 파일 작업에 라이브러리를 사용해야합니다. 간단히하기 위해, 필자는 열 개수에 관계없이 모든 파일에 날짜 열을 추가하는 것과 같은 간단한 작업을 수행해야한다고 가정합니다. Super CSV로 그 작업을하고 싶습니다. 왜냐하면 다른 라이브러리에서도이 라이브러리를 사용하기 때문입니다.수퍼 CSV를 사용하여 알 수없는 열 수를 가진 CSV 파일을 처리하는 방법

내가 어려움을 겪고있는 것은 개념적인 문제입니다. 얼마나 많은 열이 있는지 미리 알지 못한다면 파일을 다루는 방법을 모르겠습니다. 어떤 CSV 파일을 매핑하는 POJO를 어떻게 정의해야하는지, 또는 얼마나 많은 열이 파일에 있는지를 모르는 경우 어떻게 셀 프로세서를 정의해야하는지 잘 모르겠습니다. 어떻게 컬럼 수와 일치하는 Cell 프로세서를 동적으로 생성 할 수 있습니까? 예를 들어 CSV 파일의 헤더를 기반으로 POJO를 정의하는 방법은 무엇입니까?

두 개의 CSV 파일 products.csv 및 address.csv가있는 경우를 생각해보십시오. 같은 일을하는 두 가지 메소드 (예 : addDateColumnToProduct() 및 addDateColumnToAddress())를 작성하지 않고 두 파일에 대해 오늘 날짜가있는 날짜 열을 추가한다고 가정합니다.

product.csv :

name, description, price 
"Apple", "red apple from Italy","2.5€" 
"Orange", "orange from Spain","3€" 

address.csv :

CSV 파일의 헤더 정보를 바탕으로
firstname, lastname 
"John", "Doe" 
"Coole", "Piet" 

가 어떻게이 제품 CSV 매핑하는 POJO를 정의 할 수 있을까? 셀 프로세서에 대해 동일한 질문이 있습니까? 어떻게하면 기본적으로 생성자에 대한 매개 변수의 양이 기본적으로 매우 간단한 셀 프로세서라도 정의 할 수 있습니다. product.csv

CellProcessor[] processor = new CellProcessor[] { 
    null, 
    null, 
    null 
}; 

과 address.csv에 대한 :

CellProcessor[] processor = new CellProcessor[] { 
    null, 
    null 
}; 

이도 가능합니까? 이것을 달성하기 위해 내가 잘못 추적하고 있습니까?

편집 1 : I 오전 하지는 CSV 파일을 하나 개의 파일에 변수 열을 갖는 해결할 수있는 솔루션을 찾고. 런타임 중에 임의의 CSV 파일을 처리 할 수 ​​있는지, 즉 런타임 중에 CSV 파일에 포함 된 헤더 정보에만 기반한 POJO를 작성할 수 있는지를 파악하려고합니다. csv 파일의 열 수를 미리 알지 못하면서

솔루션 대답을 기반으로하고 @baba 의견

private static void readWithCsvListReader() throws Exception { 

     ICsvListReader listReader = null; 
     try { 
       listReader = new CsvListReader(new FileReader(fileName), CsvPreference.TAB_PREFERENCE); 

       listReader.getHeader(true); // skip the header (can't be used with CsvListReader) 
       int amountOfColumns=listReader.length(); 
       CellProcessor[] processor = new CellProcessor[amountOfColumns]; 
       List<Object> customerList; 

       while((customerList = listReader.read(processor)) != null) { 
         System.out.println(String.format("lineNo=%s, rowNo=%s, customerList=%s", listReader.getLineNumber(), 
           listReader.getRowNumber(), customerList)); 
       } 

     } 
     finally { 
       if(listReader != null) { 
         listReader.close(); 
       } 
     } 
} 

답변

3

아마 조금 늦었지만 ... 도움이 될 수

대신 "변수 열"의 것
CellProcessor[] processors=new CellProcessor[properties.size()]; 

    for(int i=0; i< properties.zise(); i++){ 
      processors[i]=new Optional(); 

    } 
    return processors; 
+0

'for (int i = 0; i Sid

1

이것은 매우 일반적인 문제이며, 슈퍼의 CSV 페이지를 포함하여 internetz에 여러 개의 튜토리얼이 있습니다 :

http://supercsv.sourceforge.net/examples_reading_variable_cols.html

이 행의 내용 :

아래와 같이 executeProcessors() 메소드를 호출하여 read()를 호출 한 후 셀 프로세서를 실행할 수 있습니다.CSV 행을 읽은 후에 을 완료 했으므로 (listReader.length()를 사용하여) 많은 열이 있고 올바른 프로세서 수를 개 제공하는 방법을 확인할 수 있습니다.

+0

그들은 실제로 _optional 열 _를 의미한다. 이 작업을 수행하기 위해 가능한 모든 열에 대해 프로세서를 제공 한 것처럼 보입니다. – Kapep

+0

헤더를 파싱하여 미리 cols의 양을 관찰 한 다음 사용할 프로세서의 양을 결정할 수 있습니다. –

+0

감사합니다. @ 바바, 제 질문을보다 정확하게 편집했습니다. 내가 머리글을 구문 분석하고 열을 계산할 수 있지만 런타임 중에 매개 변수의 동적 번호 (예 : 각 열에 대해 하나의 "null"매개 변수)로 새 CellProcessor 객체를 만들 수 있습니까? – Stefan

관련 문제