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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:01:32