春バッチ:ファイルのマルチフォーマットの読み込み

若いです:

私は春のバッチを使用してTXTファイルを読み込むしようとしているが、私の問題は、各ファイルが異なるデータを持っています。例えば、クラスファイル対応の各行は、そうライン毎にiが異なるFlatFileItemReader、トークナイザ、及びFieldSetMapperを必要とします。

私のファイルは、以下のようになります。

00|0|56||Class1|25|001|0
02|23|11||Class2|65|ENG|ENG|
02|32|25||Class3|45|0101|FRA|Es|TR

私は、同じデータのフォーマットが含まれている読み取りファイルを試してみた、それが動作しますが、私は別の形式のファイルをどのように行うのか分かりません。

FlatFileItemReader<Class1> fileReader=new FlatFileItemReader<Class1>();
fileReader.setResource(new ClassPathResource("/file.txt"));
DefaultLineMapper<Class1> lineMapper=new DefaultLineMapper<Class1>();
DelimitedLineTokenizer tokenizer=new DelimitedLineTokenizer();
tokenizer.setDelimiter("|");
lineMapper.setLineTokenizer(tokenizer);
fileReader.setLineMapper(lineMapper);

任意の助けいただければ幸いです。感謝

ルカ・バッソ・リッチ:

ちょっとの作成CompositeLineMapperあなたが別の保管場所にLineMapperあなたが管理する必要のあるクラスのすべてのタイプのための実装固有の。
これはCompositeLineMapper、ファイル内のすべての行のために、先読みます弁別列と派遣を右にLineMapper実装。私はSB ATMを使用していないので、私はあなたに実装を残したので、私は、あなたのコードを与えることはできません。

EDITは:項目を分類する方法の例を追加します

ここに基づく複合ラインマッパーでありますClassifier

import org.springframework.batch.item.file.LineMapper;
import org.springframework.classify.Classifier;

public class ClassifierCompositeLineMapper implements LineMapper<Object> {

    private Classifier<String, LineMapper<?>> classifier;

    public ClassifierCompositeLineMapper(Classifier<String, LineMapper<?>> classifier) {
        this.classifier = classifier;
    }

    @Override
    public Object mapLine(String line, int lineNumber) throws Exception {
        return classifier.classify(line).mapLine(line, lineNumber);
    }
}

そして、ここでそれを使用する方法です。

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import org.springframework.batch.item.file.LineMapper;
import org.springframework.batch.item.file.mapping.PassThroughLineMapper;
import org.springframework.classify.Classifier;

public class ClassifierCompositeLineMapperTest {

    private ClassifierCompositeLineMapper compositeLineMapper;

    @Before
    public void setUp() {
        Classifier<String, LineMapper<?>> classifier = new Classifier<String, LineMapper<? extends Object>>() {
            @Override
            public LineMapper<?> classify(String classifiable) {
                if (classifiable.contains("Class1")) {
                    return new Class1LineMapper();
                }

                if (classifiable.contains("Class2")) {
                    return new Class2LineMapper();
                }
                return new PassThroughLineMapper(); // or any other default line mapper
            }
        };
        compositeLineMapper = new ClassifierCompositeLineMapper(classifier);
    }

    @Test
    public void mapLine() throws Exception {
        Object line1 = compositeLineMapper.mapLine("00|0|56||Class1|25|001|0", 1);
        Assert.assertTrue(line1 instanceof Class1);
        Object line2 = compositeLineMapper.mapLine("02|23|11||Class2|65|ENG|ENG|", 2);
        Assert.assertTrue(line2 instanceof Class2);
    }

    static class Class1 {}
    static class Class1LineMapper implements LineMapper<Class1> {

        @Override
        public Class1 mapLine(String line, int lineNumber) throws Exception {
            return new Class1(); // TODO mapping logic
        }
    }

    static class Class2 {}
    static class Class2LineMapper implements LineMapper<Class2> {

        @Override
        public Class2 mapLine(String line, int lineNumber) throws Exception {
            return new Class2(); // TODO mapping logic
        }
    }

}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=214873&siteId=1