如何基于员工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
相关产品推荐
相关产品推荐

