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

如何基于员工ID与成本中心从CSV文件中查找重复行

基于员工ID和成本中心检测CSV重复行的实现方案

你可以通过维护已出现的字段组合集合的方式来检测重复行,具体修改如下:

核心思路

用一个Set存储已经处理过的「员工ID + 成本中心」唯一组合,遍历每一行时提取这两个字段,生成唯一标识后检查集合:

  • 若标识已存在,判定为重复行,记录错误信息
  • 若不存在,将标识加入集合,继续处理下一行

修改后的完整代码

// 导入必要类
import java.util.HashSet;
import java.util.Set;

BufferedReader br = new BufferedReader(new InputStreamReader(_config.getPayrollFileUpload().getFile().getInputStream()));
// 存储已出现的员工ID+成本中心组合,避免重复
Set<String> seenCombinations = new HashSet<>();
// 假设员工ID是第2列(索引1)、成本中心是第4列(索引3),请根据你的CSV实际列序调整
final int EMPLOYEE_ID_COLUMN = 1;
final int COST_CENTER_COLUMN = 3;

while ((currentLine = br.readLine()) != null) {
    currentLine = removeCommaFromData(currentLine);
    currentLineSplit = currentLine.replace(",", "");
    currentLineNum++;
    
    // 跳过表头行
    if (currentLineNum == 1) {
        continue;
    }
    
    // 空行检测逻辑保留
    if (currentLineSplit.equals("")) {
        _messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.payroll.emptyRow", String.valueOf(currentLineNum)));
        emptyRow = true;
        continue;
    }
    
    // 分割CSV行获取字段数组
    String[] fields = currentLine.split(",");
    // 校验列数是否符合预期(避免数据格式错误)
    if (fields.length < 5) {
        _messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.payroll.invalidRow", String.valueOf(currentLineNum)));
        continue;
    }
    
    // 提取员工ID和成本中心字段
    String employeeId = fields[EMPLOYEE_ID_COLUMN].trim();
    String costCenter = fields[COST_CENTER_COLUMN].trim();
    
    // 生成唯一组合标识(用不会出现在字段中的分隔符,避免拼接冲突)
    String combinationKey = employeeId + "|" + costCenter;
    
    // 检查是否重复
    if (seenCombinations.contains(combinationKey)) {
        _messages.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("error.payroll.duplicateRow", String.valueOf(currentLineNum), employeeId, costCenter));
    } else {
        seenCombinations.add(combinationKey);
    }
}

关键说明

  • 列索引调整:代码中EMPLOYEE_ID_COLUMN和COST_CENTER_COLUMN的数值需要根据你的CSV实际列位置修改(CSV列从0开始计数)
  • 分隔符选择:用|作为组合标识的分隔符,确保不会和字段内的内容冲突,如果你的字段可能包含|,可以换成其他特殊字符(如#@#)
  • 额外校验:增加了列数校验,避免因CSV格式错误导致数组越界
  • 错误信息:新增的重复行错误信息可以自定义提示文本,比如error.payroll.duplicateRow对应的消息可以设为"第{0}行重复:员工ID={1},成本中心={2}"

内容的提问来源于stack exchange,提问作者Kank Moiz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:15:40