2014-01-28 3 views
0

저는 Spring Batch를 사용하여 여러 열 유형이 혼합 된 DB 테이블에서 CSV 파일을 추출합니다. 샘플 테이블 SQL 스키마는 'first_itm_ration'필드에 대한 샘플 데이터베이스 열 값이 스프링 배치 : BigDecimal 형식의 PassThroughFieldExtractor

first_itm_ratio 
1.050750 
0.920000 

을하지만 내 CSV 값에서 후행 제로의 드롭 싶습니다

[product] [varchar](16) NOT NULL, 
[version] [varchar](16) NOT NULL, 
[life_1_dob] [date] NOT NULL, 
[first_itm_ratio] [decimal](9,6) NOT NULL, 

입니다.

first_itm_ratio 
1.05075 
0.92 

나는 테이블의 각 특정 필드의 서식을 정의해야하지 않으려는 것이 아니라 해당 데이터 유형의 모든 컬럼들에 대해 전역 객체 특정 형식이있을 것이다.

내 csvFileWriter 콩

<bean id="csvFileWriter"  class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step"> 
    <property name="resource" ref="fileResource"/> 
    <property name="lineAggregator"> 
     <bean class="org.springframework.batch.item.file.transform.DelimitedLineAggregator"> 
      <property name="delimiter"> 
       <util:constant static-field="org.springframework.batch.item.file.transform.DelimitedLineTokenizer.DELIMITER_COMMA"/> 
      </property> 
      <property name="fieldExtractor"> 
       <bean class="org.springframework.batch.item.file.transform.PassThroughFieldExtractor" /> 
      </property> 
     </bean> 
    </property> 
</bean> 

답변

1

당신은

  1. 를 작성 할 수 있습니다 후행없이 큰 소수를 포맷 BigDecimalToStringConverter implements Converter<BigDecimal, String>을 자신의 공의
  2. 만들기 새로운 ConversionService (MyConversionService) 및 사용자 정의 변환
  3. 로 등록
  4. 확장 DelimitedLineAggregator, 삽입 MyConversionService, 무시 포맷 필드와 E doAggregate() 전환 서비스

public class MyConversionService extends DefaultConversionService { 
    public MyConversionService() { 
    super(); 
    addConverter(new BigDecimalToStringConverter()); 
    } 
} 

public class MyFieldLineAggregator<T> extends DelimitedLineAggregator<T> { 
    private ConversionService cs = new MyConversionService(); 

    public String doAggregate(Object[] fields) { 
    for(int i = 0;i < fields.length;i++) { 
     final Object o = fields[i]; 
     if(cs.canConvert(o.getClass(), String.class)) { 
     fields[i] = cs.convert(o, String.class); 
     } 
    } 
    return super.doAggregate(fields); 
    } 
} 
에게 주입 사용