Java解析CACM数据集遇问题,求字段提取代码解决方案
解决Java解析CACM数据集字段提取的问题
看起来你的extract方法卡在了字段结束的判断逻辑上对吧?CACM的格式里每个字段都是以.加单个字母开头,遇到下一个这样的标识就代表当前字段结束,咱们可以基于这个规则完善你的方法。
先给你一个完整的可运行实现:
public static String extract(char campo, String text, boolean allowEmpty) { String[] lines = text.split("\\r?\\n"); StringBuilder builder = new StringBuilder(); boolean start = false; // 构建目标字段的标识前缀,比如提取标题时就是".T" String fieldPrefix = "." + campo; for (String line : lines) { line = line.trim(); // 先去除首尾空白,避免换行或多余空格干扰判断 // 判断是否命中当前字段的起始行 if (line.startsWith(fieldPrefix)) { start = true; // 跳过字段标识本身,提取后面的内容 String contentPart = line.substring(fieldPrefix.length()).trim(); if (!contentPart.isEmpty()) { builder.append(contentPart).append(" "); } continue; } // 如果已经开始提取当前字段,检查是否遇到下一个字段的标识 if (start) { // 下一个字段的特征:以"."开头,且第二个字符是字母(比如.A、.W) if (line.startsWith(".") && line.length() >= 2 && Character.isLetter(line.charAt(1))) { break; // 遇到下一个字段,停止当前字段的提取 } // 否则将当前行内容追加到结果中 if (!line.isEmpty()) { builder.append(line).append(" "); } } } String result = builder.toString().trim(); // 根据allowEmpty参数处理空结果的返回值 if (!allowEmpty && result.isEmpty()) { return null; } return result; }
关键逻辑说明:
- 字段起始判断:通过
line.startsWith("." + campo)精准匹配目标字段的开头,比如提取标题时就是.T - 字段结束判断:当已经开始提取后,遇到以
.开头且第二个字符是字母的行,就判定为下一个字段,停止当前提取 - 多行内容处理:遍历每一行,只要没遇到下一个字段标识,就持续追加内容,同时自动处理行首尾的空白
- 空值控制:通过
allowEmpty参数灵活控制,空内容时可以返回空字符串或null
调用示例:
假设你有一段CACM条目文本:
.I 1 .T Experimental Programming .A John Doe .A Jane Smith .W This is a multi-line body text for the CACM document.
提取标题可以这么调用:
String title = extract('T', cacmText, false); // 输出:"Experimental Programming"
提取多个作者的话,可以先提取出所有作者内容,再拆分:
String authorStr = extract('A', cacmText, false); String[] authors = authorStr.split("(?=\\.A)"); // 按.A标识拆分多个作者 // 处理后得到["John Doe", "Jane Smith"]
这样就能正确处理所有字段的提取,包括多行正文和多作者的场景了。
内容的提问来源于stack exchange,提问作者David Maseda Neira
相关产品推荐
相关产品推荐

