Java Spring批处理以比较两个文件并找到匹配的记录

Java Spring批处理以比较两个文件并找到匹配的记录,java,spring-batch,Java,Spring Batch,无论如何,我们可以根据任何特定列比较两个不同的文件,并使用SpringBatch从一个文件中获取值 例如: 文件1内容: FirstName, LastName, Age FirstName, LastName, Business 文件2内容: FirstName, LastName, Age FirstName, LastName, Business 我的要求是基于FirstName和LastName,我需要获得业务字段。基本上,我将迭代文件1并搜索文件2中的匹配记录 目前我正在做的是

无论如何,我们可以根据任何特定列比较两个不同的文件,并使用SpringBatch从一个文件中获取值

例如:

文件1内容:

FirstName, LastName, Age
FirstName, LastName, Business
文件2内容:

FirstName, LastName, Age
FirstName, LastName, Business
我的要求是基于FirstName和LastName,我需要获得业务字段。基本上,我将迭代文件1并搜索文件2中的匹配记录

目前我正在做的是使用ApacheLucene索引文件2,使用SpringBatch迭代文件1,并在Lucene索引中搜索以获得匹配的文档

我正在寻找使用SpringBatch或任何其他框架的类似功能

问候,,
Shankar

如果您想使用排序后的输入文件,类似的方法应该可以:

public class MergingItemReader implements ItemStreamReader<MergedRecord> {

    private ItemStreamReader<RecordTypeA> readerA;
    private ItemStreamReader<RecordTypeB> readerB;

    @Override
    public MergedRecord read() throws Exception {
        RecordTypeA itemA = readerA.read();
        RecordTypeB itemB = readerB.read();
        Assert.isTrue(itemA.getKey().equals(itemB.getKey()), "Inconsistent data");
        return new MergedRecord(itemA, itemB);
    }

    @Override
    public void open(ExecutionContext executionContext) throws ItemStreamException {
        readerA.open(executionContext);
        readerB.open(executionContext);
    }

    @Override
    public void update(ExecutionContext executionContext) throws ItemStreamException {
        readerA.update(executionContext);
        readerB.update(executionContext);
    }

    @Override
    public void close() throws ItemStreamException {
        readerA.close();
        readerB.close();
    }

    public void setReaderA(ItemStreamReader<RecordTypeA> readerA) {
        this.readerA = readerA;
    }

    public void setReaderB(ItemStreamReader<RecordTypeB> readerB) {
        this.readerB = readerB;
    }

}
公共类MergingItemReader实现ItemStreamReader{
私有项目阅读器readerA;
私有项目流读卡器;
@凌驾
public MergedRecord read()引发异常{
RecordTypeA itemA=readerA.read();
RecordTypeB itemB=readerB.read();
Assert.isTrue(itemA.getKey().equals(itemB.getKey()),“不一致数据”);
返回新的合并记录(项目A、项目B);
}
@凌驾
public void open(ExecutionContext ExecutionContext)抛出ItemStreamException{
readerA.open(executionContext);
readerB.open(executionContext);
}
@凌驾
公共无效更新(ExecutionContext ExecutionContext)引发ItemStreamException{
更新(executionContext);
readerB.update(executionContext);
}
@凌驾
public void close()引发ItemStreamException{
readerA.close();
readerB.close();
}
public void setReaderA(ItemStreamReader readerA){
this.readerA=readerA;
}
public void setReaderB(ItemStreamReader readerB){
this.readerB=readerB;
}
}

关于你的另一个关于
CompositeItemReader
:没有这样的事情。也许你把它和CompositeItemWriter混淆了

你的输入文件是按名字还是姓氏排序的?在这种情况下,您可以创建一个同时在两个文件上迭代的自定义ItemReader。。我只是举个例子。。我们的文件内容更多的是字母数字组合,它没有排序…感谢您的信息。这是我们可以用复合项阅读器做的事情吗?不,如果输入文件没有排序,那么我相信您当前将其中一个文件写入数据存储的方法是完全可行的。@Jimmy Praet。。只是想知道如何编写一个同时读取文件的自定义读取器。。我读取复合项阅读器将读取多个文件simultaneously@JimmyPraet…如果我按排序的顺序获取文件,它会比我当前的方法更快吗?如果是,如何在流程方法中同时获取两条记录?