Spring Batch处理flat文件时如何用FlatItemReader跳过头尾提取指定数据
问题解答
结论
无需编写全自定义读取器,仅使用Spring Batch自带的FlatItemReader配合自定义行映射逻辑即可实现需求。
具体实现步骤
核心逻辑说明
你的文件以~为分隔符,我们只需要在读取行时先定位Detail和Footer两个标记的位置,截取中间的字段按「姓名、年龄」两两分组映射为客户实体即可。
代码实现
1. 先定义客户实体类
public class Customer { private String name; private Integer age; // 构造方法、getter、setter自行补充 }
2. 配置FlatItemReader
@Bean public FlatFileItemReader<Customer> customerFlatItemReader() { FlatFileItemReader<Customer> reader = new FlatFileItemReader<>(); // 设置你的文件资源路径 reader.setResource(new FileSystemResource("/path/to/your/datafile")); // 自定义行映射逻辑 reader.setLineMapper((line, lineNum) -> { String[] allFields = line.split("~"); int detailPos = -1; int footerPos = -1; // 定位两个标记字段的位置 for (int i = 0; i < allFields.length; i++) { if ("Detail".equals(allFields[i])) detailPos = i; if ("Footer".equals(allFields[i])) footerPos = i; } // 格式校验,不符合直接返回null跳过 if (detailPos < 0 || footerPos <= detailPos + 1) { return null; } // 这里演示单对象返回,如果一行需要返回多个客户,可以自行包装为可返回列表的读取器 // 取第一个有效客户返回,多客户场景可以用队列缓存逐个输出 return new Customer(allFields[detailPos + 1], Integer.parseInt(allFields[detailPos + 2])); }); return reader; }
单行多客户场景适配
如果你一行包含多个客户(比如示例里的Alex、Mark、Helen、Andrew共4个客户),可以做轻量扩展:
- 自定义一个包装类读取器,把
FlatItemReader返回的客户列表缓存到队列,逐个返回给后续处理流程即可,不需要重写整个文件读取逻辑。
什么时候需要自定义读取器
只有当你需要处理跨行列、特殊换行规则、多文件合并读取等复杂场景时,才需要完全自定义实现ItemReader接口,当前需求用自带组件完全可以覆盖。
内容的提问来源于stack exchange,提问作者Akalanka Hewawasam
相关产品推荐
相关产品推荐

