
本文介绍如何精准提取文本行中从开头到第二个逗号(含)之间的子字符串,适用于csv解析、日志过滤等场景,核心方法是结合 `string.indexof()` 的嵌套调用与 `substring()` 定位截取。
在处理结构化文本(如简易CSV格式)时,常需按特定分隔符进行条件截断——例如仅保留字段前两部分,即截至第二个逗号为止的内容。原始代码中使用 split(",", 5) 会将整行切分为最多5段,但无法直接获取“前两段加第二个逗号”的完整子串;而仅打印 itemID[0] 只能得到首字段,丢失了第一个逗号及后续内容。
正确做法是利用 String.indexOf() 的重载方法定位第二个逗号的索引位置:
int firstComma = line.indexOf(",");
if (firstComma == -1) {
// 行中无逗号,跳过或按需处理
continue;
}
int secondComma = line.indexOf(",", firstComma + 1);
if (secondComma == -1) {
// 行中只有一个逗号,取整行或按业务逻辑决定(如保留到第一个逗号)
System.out.println(line.substring(0, firstComma + 1));
} else {
// 截取从开头到第二个逗号(含)的子串
System.out.println(line.substring(0, secondComma + 1));
}⚠️ 注意事项:
- indexOf(String str, int fromIndex) 从指定下标开始搜索,因此 line.indexOf(",", firstComma + 1) 确保跳过第一个匹配项;
- 必须检查返回值是否为 -1,避免 substring() 抛出 StringIndexOutOfBoundsException;
- 此方案不依赖正则表达式,性能更优,且语义清晰、易于维护;
- 若需扩展为“第N个分隔符”,可封装为通用方法,通过循环调用 indexOf 实现。
将该逻辑整合进您的 fileReader() 方法中,即可精准输出如 14, "Stanley #2 Philips Screwdriver" 这类结果,满足字段边界控制需求。
立即学习“Java免费学习笔记(深入)”;










