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

如何识别数据每行的分隔符?附Java代码求助

分隔符识别问题解决方案

问题说明

我正在处理一个需要识别数据所用分隔符的任务,样本数据如下:

1 2 3 4

10 20 30 40

1,3,1,2,3,4

4;3;2;2;1

1,3,1 2 3 4

要求为每行数据识别对应的分隔符,输出示例如下:

1st line: SPACE
2nd line: SPACE
3rd line: COMMA
4th line: SEMICOLON
5th line: COMMA & SPACE

我需要知道如何检测空格、逗号、分号等分隔符,包括混合分隔符的情况?

以下是我尝试编写的Java代码:

public class Main {
    public static void main(String[] args) throws FileNotFoundException {
        String textFile = "src/com/company/zadanie3/liczby.txt.txt";
        String line = "";
        String textsplitBy = " , ";
        String delimiter = " ";
        boolean firstLine = true;
        try(BufferedReader br = new BufferedReader(new FileReader(textFile))){
            while((line = br.readLine()) != null){
                if(firstLine){
                    delimiter = determineDelimiter(line);
                    if(delimiter.equalsIgnoreCase(" ")){
                        System.out.println("Spacja");
                    } else if (delimiter.equalsIgnoreCase(textsplitBy)){
                        System.out.println("Przecinek");
                    }else if(delimiter.equalsIgnoreCase("\t")){
                        System.out.println("Tabulator");
                    }
                    firstLine = false;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static List<String> delimiterList = Arrays.asList(",",";","\t","|");

    private static String determineDelimiter(String text){
        for (String delimiter : delimiterList){
            if(text.contains(delimiter)){
                return delimiter;
            }
        }
        return "";
    }
}

现有代码问题分析

  1. 仅处理第一行数据,未遍历所有行输出结果
  2. 无法识别混合分隔符:找到第一个匹配的分隔符就直接返回,忽略了行内可能存在的其他分隔符
  3. 判断逻辑错误:比如textsplitBy = " , "不符合实际逗号分隔场景,且符号类分隔符不需要用equalsIgnoreCase判断
  4. 未将空格纳入候选分隔符列表,导致无法识别空格分隔的行

改进方案与代码

核心思路

  • 遍历文件所有行,逐行检测分隔符
  • 对每行数据,检查所有候选分隔符的存在情况,收集所有有效分隔符
  • 为分隔符映射统一的显示名称,便于输出
  • 处理空行、无分隔符等特殊情况

改进后的Java代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DelimiterDetector {
    // 定义候选分隔符与对应显示名称的映射
    private static final Map<String, String> DELIMITER_NAMES = new HashMap<>();
    static {
        DELIMITER_NAMES.put(" ", "SPACE");
        DELIMITER_NAMES.put(",", "COMMA");
        DELIMITER_NAMES.put(";", "SEMICOLON");
        DELIMITER_NAMES.put("\t", "TAB");
    }

    public static void main(String[] args) {
        String textFile = "src/com/company/zadanie3/liczby.txt.txt";
        
        try(BufferedReader br = new BufferedReader(new FileReader(textFile))){
            String line;
            int lineNumber = 0;
            while((line = br.readLine()) != null){
                lineNumber++;
                // 跳过空行
                if(line.trim().isEmpty()){
                    System.out.printf("%dth line: EMPTY%n", lineNumber);
                    continue;
                }
                List<String> detectedDelimiters = detectDelimiters(line);
                // 格式化输出结果
                if(detectedDelimiters.isEmpty()){
                    System.out.printf("%dth line: NO DELIMITER%n", lineNumber);
                } else if(detectedDelimiters.size() == 1){
                    System.out.printf("%dth line: %s%n", lineNumber, DELIMITER_NAMES.get(detectedDelimiters.get(0)));
                } else {
                    String joined = String.join(" & ", detectedDelimiters.stream().map(DELIMITER_NAMES::get).toList());
                    System.out.printf("%dth line: %s%n", lineNumber, joined);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static List<String> detectDelimiters(String line) {
        List<String> result = new ArrayList<>();
        for(String delimiter : DELIMITER_NAMES.keySet()){
            // 排除首尾的分隔符,避免误判
            if(line.contains(delimiter) && !line.startsWith(delimiter) && !line.endsWith(delimiter)){
                result.add(delimiter);
            }
        }
        return result;
    }
}

代码说明

  1. DELIMITER_NAMES映射表统一管理分隔符与显示名称,后续新增分隔符只需在此处添加
  2. 遍历文件所有行,逐行处理,空行直接标注为EMPTY
  3. detectDelimiters方法会收集当前行中所有有效存在的分隔符,排除出现在首尾的误判情况
  4. 根据检测到的分隔符数量,输出对应格式的结果:单个分隔符直接显示名称,多个用&连接,无分隔符标注NO DELIMITER

内容的提问来源于stack exchange,提问作者wieszak09

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:15:33