如何识别数据每行的分隔符?附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 ""; } }
现有代码问题分析
- 仅处理第一行数据,未遍历所有行输出结果
- 无法识别混合分隔符:找到第一个匹配的分隔符就直接返回,忽略了行内可能存在的其他分隔符
- 判断逻辑错误:比如
textsplitBy = " , "不符合实际逗号分隔场景,且符号类分隔符不需要用equalsIgnoreCase判断 - 未将空格纳入候选分隔符列表,导致无法识别空格分隔的行
改进方案与代码
核心思路
- 遍历文件所有行,逐行检测分隔符
- 对每行数据,检查所有候选分隔符的存在情况,收集所有有效分隔符
- 为分隔符映射统一的显示名称,便于输出
- 处理空行、无分隔符等特殊情况
改进后的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; } }
代码说明
DELIMITER_NAMES映射表统一管理分隔符与显示名称,后续新增分隔符只需在此处添加- 遍历文件所有行,逐行处理,空行直接标注为
EMPTY detectDelimiters方法会收集当前行中所有有效存在的分隔符,排除出现在首尾的误判情况- 根据检测到的分隔符数量,输出对应格式的结果:单个分隔符直接显示名称,多个用
&连接,无分隔符标注NO DELIMITER
内容的提问来源于stack exchange,提问作者wieszak09
相关产品推荐
相关产品推荐

