
本文介绍如何使用 java 8 stream api 对 csv 文件中特定列(如 col5)进行高效清洗:移除首尾标识符、将冒号分隔符替换为逗号,并保留关键组件,最终与另一列(如 col8)组合输出标准化结果。
本文介绍如何使用 java 8 stream api 对 csv 文件中特定列(如 col5)进行高效清洗:移除首尾标识符、将冒号分隔符替换为逗号,并保留关键组件,最终与另一列(如 col8)组合输出标准化结果。
在处理结构化文本(如 CSV)时,常需对某列内容做语义清洗——例如从形如 12345:sdc-posistion-svc:SnakeYAML:2.1:3 的字符串中提取核心服务名、组件名和版本号,同时剔除冗余前缀(12345)与后缀(3)。Java 8 的 Stream API 提供了函数式、可链式组合的处理能力,完全可在单一流水线中完成解析、转换、过滤与重组,避免传统 for 循环带来的冗余代码与可维护性问题。
核心思路是:将原始 CSV 行映射为字段列表 → 提取目标列(col5 和 col8)→ 对 col5 执行定制化清洗 → 合并为新格式字符串。清洗逻辑包括三步:
- 用
replaceAll(":", ",")将所有:替换为,,获得临时字符串(如"12345,sdc-posistion-svc,SnakeYAML,2.1,3"); - 截断首尾:先用
lastIndexOf(',', length - 2)定位倒数第二个逗号位置,再substring(0, pos)去掉末尾数字; - 移除首个单词(即开头的
12345,):用replaceFirst("\b\w+\b,", "")精确匹配首单词加逗号,再.substring(1)消除可能残留的前导逗号。
为提升可读性与可扩展性,建议将清洗逻辑封装为静态工具方法:
private static String cleanAndCombine(String col5Value, String col8Value) {
// 步骤1:替换分隔符
String replaced = col5Value.replaceAll(":", ",");
// 步骤2:截去末尾(保留到倒数第二个逗号)
int lastCommaIndex = replaced.lastIndexOf(',', replaced.length() - 2);
String truncated = (lastCommaIndex > 0) ? replaced.substring(0, lastCommaIndex) : replaced;
// 步骤3:移除首个单词及后续逗号(如 "12345," → ""),再拼接 col8
String cleaned = truncated.replaceFirst("^\w+,", "").trim();
return cleaned + "," + col8Value;
}
然后在主流程中直接调用该方法,使 Stream 链清晰简洁:
public static void getData3() throws IOException {
Path path = Paths.get("D:/blackduck_sample.txt");
if (!Files.exists(path)) return;
List<string> lines = Files.readAllLines(path);
List<string> headers = Arrays.asList(lines.get(0).split(","));
int col5Index = headers.indexOf("col5");
int col8Index = headers.indexOf("col8");
List<string> result = lines.stream()
.skip(1) // 跳过表头
.filter(line -> !line.trim().isEmpty())
.map(line -> {
String[] fields = line.split(",", -1); // -1 保留末尾空字段
return cleanAndCombine(
fields.length > col5Index ? fields[col5Index] : "",
fields.length > col8Index ? fields[col8Index] : ""
);
})
.filter(s -> !s.startsWith(",") && s.contains(",")) // 基础校验
.collect(Collectors.toList());
result.forEach(System.out::println);
}</string></string></string>
✅ 输出示例(对应原始数据):
sdc-posistion-svc,SnakeYAML,2.1,OverDue sdc-event-generation-svc,SpringBoot,2.1.2.Release,Overdue sdc-event-subscription-svc,Apache Tomcat,9.0.70,Due in <p>⚠️ <strong>注意事项</strong>:</p>
- 使用
split(",", -1)可防止 CSV 中含空字段被忽略(如a,,c); - 正则
^\w+,确保只匹配行首单词+逗号,避免误删中间内容; - 实际生产中建议增加异常防护(如
IndexOutOfBoundsException捕获)或使用 Apache Commons CSV 库处理复杂 CSV(含引号、换行等); - 若需进一步结构化(如转为对象),可将
cleanAndCombine()返回String[]或自定义 DTO,再用map构造实例。
通过合理拆分职责(提取 → 清洗 → 组合)并利用 Stream 的惰性求值与函数式风格,代码既保持高可读性,又具备良好的可测试性与演进潜力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











