You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FlatFileItemReader将10行数据作为一条记录读取?

实现10行合并为一条记录的FlatFileItemReader

要实现将10行数据合并为一条记录读取,核心是通过自定义RecordSeparatorPolicy改变FlatFileItemReader的记录拆分规则——默认按单行拆分,我们可以自定义策略攒够10行再返回一个完整记录。

步骤1:自定义RecordSeparatorPolicy

这个类负责判断何时构成一条完整记录,并将多行拼接成一个字符串返回:

public class TenLineRecordSeparatorPolicy implements RecordSeparatorPolicy {
    private int lineCounter = 0;
    private StringBuilder recordBuffer = new StringBuilder();

    @Override
    public boolean isEndOfRecord(String line) {
        lineCounter++;
        recordBuffer.append(line).append(System.lineSeparator());
        // 每累积10行,标记为一条完整记录
        return lineCounter % 10 == 0;
    }

    @Override
    public String postProcess(String record) {
        // 返回拼接好的10行内容,去除末尾多余换行
        String fullRecord = recordBuffer.toString().trim();
        // 重置缓冲区和计数器,准备下一条记录
        recordBuffer.setLength(0);
        return fullRecord;
    }

    @Override
    public String preProcess(String line) {
        return line;
    }
}

步骤2:修改FlatFileItemReader配置

在reader中设置自定义的分隔策略,替换默认的单行拆分逻辑:

public FlatFileItemReader<List<SMSData>> flatFileItemReader() {
    FlatFileItemReader<List<SMSData>> flatFileItemReader = new FlatFileItemReader<>();
    
    flatFileItemReader.setResource(new FileSystemResource(new File("C:\\Users\\mdtouhid.it\\Downloads\\Flat-File-Item-Reader-In-Action\\InputFiles\\finalsms4appr1.csv")));
    flatFileItemReader.setLineMapper(lineMapper());
    flatFileItemReader.setLinesToSkip(1); // 跳过表头行
    // 应用自定义的10行合并策略
    flatFileItemReader.setRecordSeparatorPolicy(new TenLineRecordSeparatorPolicy());
    
    // 注意:原代码的setMaxItemCount(10)是限制读取10条记录(即100行),如果需要读取全部记录请移除该设置
    // flatFileItemReader.setMaxItemCount(10);
    
    System.out.println("Inside Item flat file reader" + flatFileItemReader);
    return flatFileItemReader;
}

步骤3:调整LineMapper处理合并后的多行内容

现在mapLine方法的combinedLines参数会收到10行拼接的字符串,拆分后转换为SMSData列表即可:

@Bean
LineMapper<List<SMSData>> lineMapper() {
    return new LineMapper<List<SMSData>>() {
        @Override
        public List<SMSData> mapLine(String combinedLines, int lineNumber) throws Exception {
            System.out.println("Inside line print: " + combinedLines);
            List<SMSData> dataList = new ArrayList<>();
            // 拆分拼接的字符串为单行
            String[] lines = combinedLines.split(System.lineSeparator());
            for (String line : lines) {
                dataList.add(SMSData.of(line));
            }
            return dataList;
        }
    };
}

补充说明

  • 如果文件末尾不足10行,自定义策略会自动将剩余行作为最后一条记录返回。
  • 若需要灵活配置合并行数,可以将10作为参数传入自定义的TenLineRecordSeparatorPolicy,避免硬编码。

内容的提问来源于stack exchange,提问作者touhid islam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:35:30