복붙노트

[SPRING] Spring-Batch를 사용하여 id-column으로 채워 넣은 csv 줄을 읽는 방법?

SPRING

Spring-Batch를 사용하여 id-column으로 채워 넣은 csv 줄을 읽는 방법?

저는 Spring-Batch를 사용하여 CSV 파일을 읽고 내용을 포맷하고 다음과 같이 데이터베이스에 씁니다.

StepBuilder<T, T> builder = stepBuilderFactory.get("step")
    .<T, T>chunk(100)
    .reader(flatFileItemReader)
    .processor(processor)
    .writer(jpaItemWriter);

csv에 ID 열이 있습니다. ID에서 청크를 기반으로 독자를 수정할 수 있습니까? Examle :

#id, #value
1, first
1000, second
1001, second
1005, second

이 경우 청크는 첫 번째 행을 읽고 커밋 한 다음 계속 진행합니다.

파일에서 값으로 청킹을 적용 할 수 있습니까?

해결법

  1. ==============================

    1.커스텀 CompletionPolicy와 PeekableItemReader를 사용하여 동일한 작업을 수행했습니다. 코드 뒤에있는 아이디어는 다음 항목을 살펴보고 다음 요소를 읽고 값 변경을 확인하는 것입니다. 값이 변경되면 CompletionPolicy.isComplete ()에서 true를 반환합니다.

    커스텀 CompletionPolicy와 PeekableItemReader를 사용하여 동일한 작업을 수행했습니다. 코드 뒤에있는 아이디어는 다음 항목을 살펴보고 다음 요소를 읽고 값 변경을 확인하는 것입니다. 값이 변경되면 CompletionPolicy.isComplete ()에서 true를 반환합니다.

    중요 :이 정책은 단계 리스너로 등록해야합니다!

    public class BreakKeyCompletionPolicy extends CompletionPolicySupport{
        private BreakKeyCompletionContext cc;
        private PeekableItemReader<Object> reader;
        // Strategy used to check for value break
        private BreakKeyStrategy<Object> strategy;
    
        public void setReader(PeekableItemReader<Object> forseeingReader){
            this.reader = forseeingReader;
        }
    
        @Override
        public boolean isComplete(RepeatContext context){
            return this.cc.isComplete();
        }
    
        @Override
        public RepeatContext start(RepeatContext context)   {
            context.setAttribute("current", null);
            this.cc = new BreakKeyCompletionContext(context);
            return cc;
        }
        /** Context contains current element ("current" property" and manage next element.
         * Null next element is treated as a key break
         */
        protected class BreakKeyCompletionContext extends RepeatContextSupport {
            public BreakKeyCompletionContext(RepeatContext context)     {
                super(context);
            }
            public boolean isComplete(){
                final Object next;
                try{
                    next = reader.peek();
                }
                catch (Exception e){
                    throw new NonTransientResourceException("Unable to peek", e);
                }
                if (null == next){
                    return true;
                }
                return strategy.isKeyBreak(this.getAttribute("current"), next);
            }
        }
    
        @AfterRead
        public void afterRead(Object item){
            this.cc.setAttribute("current", item);
        }
    }
    
  2. from https://stackoverflow.com/questions/26905278/how-to-read-csv-lines-chunked-by-id-column-with-spring-batch by cc-by-sa and MIT license