gpt4 book ai didi

java - Spring-Batch:读取多种格式的文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:12 26 4
gpt4 key购买 nike

我正在尝试使用 spring batch 读取一个 txt 文件,但我的问题是每个文件都有不同的数据。例如,文件的每一行对应一个类,因此对于每一行,我需要不同的 FlatFileItemReader、Tokenizer 和 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 将先行鉴别器列并分派(dispatch)到正确的 LineMapper 实现。我不能给你代码,因为我没有使用 SB atm,所以我把实现留给你。

编辑:添加如何对项目进行分类的示例

这是一个基于分类器的复合线映射器:

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
}
}

}

关于java - Spring-Batch:读取多种格式的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55479974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com