如何使用Java读取长文本信息并实现指定规则的文本格式转换
Java实现文本编码转换功能
转换规则梳理
先明确需求中的固定转换规则:
- 编码单元规则:每个单元由「首字母+数字」组成,首字母对应品牌如下,数字为N时,N=1直接输出品牌名,N>1输出品牌加
N-1个+号t→Tesla、n→Nissan、b→BMW、p→Porsche、m→Maserati、a→Audi、v→Volvo、j→Jaguar、c→Cadillac
- 分组规则:每满指定长度的编码单元后用
|分隔,行末尾统一加| - 模式判断:首行带
=为单组模式,=后数字为全局分组长度;首行带different为多组模式,^开头行后的数字为当前组分组长度
完整实现代码
import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Map; public class GarageCodeConverter { // 首字母到品牌的映射表 private static final Map<Character, String> BRAND_MAP = Map.of( 't', "Tesla", 'n', "Nissan", 'b', "BMW", 'p', "Porsche", 'm', "Maserati", 'a', "Audi", 'v', "Volvo", 'j', "Jaguar", 'c', "Cadillac" ); public static void main(String[] args) throws Exception { // 读取输入文本,可修改路径为你的文件地址,也可以直接替换为字符串输入 List<String> lines = Files.readAllLines(Paths.get("input.txt"), StandardCharsets.UTF_8); if (lines.isEmpty()) return; // 处理首行,统一多余空格为单空格 String firstLine = lines.get(0).replaceAll("\\s+", " ").trim(); System.out.println(firstLine); // 判断是单组模式还是多组模式 if (firstLine.contains("=")) { // 单组模式:提取全局分组长度 int groupSize = Integer.parseInt(firstLine.split("=")[1].trim()); for (int i = 1; i < lines.size(); i++) { String codeLine = lines.get(i).trim(); if (codeLine.isEmpty()) continue; System.out.println(parseCodeLine(codeLine, groupSize)); } } else { // 多组模式:逐行读取分组配置和编码串 for (int i = 1; i < lines.size(); i++) { String line = lines.get(i).trim(); if (line.isEmpty()) continue; if (line.startsWith("^")) { int groupSize = Integer.parseInt(line.substring(1).trim()); System.out.printf("#Number of cars = %d%n", groupSize); // 读取下一行的编码串 String codeLine = lines.get(++i).trim(); System.out.println(parseCodeLine(codeLine, groupSize)); } } } } /** * 解析编码行,转换为指定格式输出 * @param codeLine 原始编码串 * @param groupSize 分组长度 * @return 转换后的字符串 */ private static String parseCodeLine(String codeLine, int groupSize) { List<String> unitList = new ArrayList<>(); // 拆分所有编码单元,每次步进2位(1个字母+1个数字) for (int i = 0; i < codeLine.length(); i += 2) { char prefix = codeLine.charAt(i); int count = Integer.parseInt(String.valueOf(codeLine.charAt(i + 1))); StringBuilder unitSb = new StringBuilder(BRAND_MAP.get(prefix)); // 数字大于1时追加对应数量的+号 if (count > 1) { // Java 11以下版本可以替换为循环生成+号 unitSb.append("+".repeat(count - 1)); } unitList.add(unitSb.toString()); } // 按分组长度拼接结果 StringBuilder resultSb = new StringBuilder(); for (int i = 0; i < unitList.size(); i++) { resultSb.append(unitList.get(i)).append(" "); // 每满分组长度加分隔符 if ((i + 1) % groupSize == 0) { resultSb.append("| "); } } // 行末尾补| if (resultSb.charAt(resultSb.length() - 2) != '|') { resultSb.append("|"); } return resultSb.toString().trim(); } }
使用说明
- 将需要转换的文本保存为
input.txt,和代码放在同一目录下,直接运行即可输出转换后的结果 - 低版本Java不支持
String.repeat的话,把"+".repeat(count - 1)替换为如下代码即可:
for (int j = 0; j < count -1; j++) { unitSb.append("+"); }
- 如果不需要从文件读取,直接把
Files.readAllLines部分替换为你自己的字符串输入即可。
内容的提问来源于stack exchange,提问作者kelvin
相关产品推荐
相关产品推荐

