Java实现读取CSV行并写入文本文件指定位置(无外部依赖)
纯Java实现CSV读取并填充到文本指定位置(无外部依赖)
我来帮你把这个需求落地,纯用Java原生API就能完成,不用引入任何外部JAR包。结合你给出的Scanner开头代码,咱们一步步实现:
核心思路
- 用
Scanner逐行读取CSV文件,处理每行的逗号分隔字段 - 单独处理最后一列(Code2)的分号分隔值
- 定义文本模板,将每个字段替换到模板的指定位置
- 将填充后的内容写入目标文本文件
完整代码实现
import java.io.*; import java.util.Scanner; public class CsvToTextProcessor { public static void main(String[] args) { // CSV文件路径(修正了你原代码里末尾多出来的反斜杠) String csvFilePath = "C:\\Users\\Documents\\order.csv"; // 目标文本文件路径 String outputTextPath = "C:\\Users\\Documents\\filled_output.txt"; // 定义文本模板,用占位符标记需要填充的位置,可根据你的需求修改格式 String textTemplate = """ ------------------------------ 日期: {{DATE}} 编码1: {{CODE}} 时间: {{TIME}} 关联编码列表: {{CODE_LIST}} ------------------------------ """; try ( // 读取CSV文件,自动关闭资源 Scanner csvScanner = new Scanner(new File(csvFilePath)); // 写入文本文件,用BufferedWriter提升批量写入效率 BufferedWriter writer = new BufferedWriter(new FileWriter(outputTextPath)) ) { csvScanner.useDelimiter("\n"); // 读取首行表头,可选:如果需要把表头也写入文本就保留,不需要可直接跳过 String headerLine = csvScanner.hasNext() ? csvScanner.next() : ""; writer.write("CSV表头: " + headerLine); writer.newLine(); writer.newLine(); // 处理CSV后续每一行数据 while (csvScanner.hasNext()) { String line = csvScanner.next().trim(); // 跳过空行避免报错 if (line.isEmpty()) continue; // 按逗号分割为4个字段,用split(",",4)确保最后一列不会被错误拆分 String[] fields = line.split(",", 4); if (fields.length != 4) { System.err.println("格式无效的CSV行,已跳过: " + line); continue; } // 提取并清洗每个字段 String date = fields[0].trim(); String code = fields[1].trim(); String time = fields[2].trim(); String code2Raw = fields[3].trim(); // 把分号分隔的编码转成更易读的格式,也可以直接保留原分号形式 String codeList = code2Raw.replace(";", ", "); // 填充模板中的占位符 String filledContent = textTemplate .replace("{{DATE}}", date) .replace("{{CODE}}", code) .replace("{{TIME}}", time) .replace("{{CODE_LIST}}", codeList); // 写入到目标文本文件 writer.write(filledContent); writer.newLine(); } System.out.println("处理完成!结果已写入: " + outputTextPath); } catch (FileNotFoundException e) { System.err.println("找不到指定的CSV文件: " + e.getMessage()); } catch (IOException e) { System.err.println("文件读写过程中出错: " + e.getMessage()); } } }
关键细节说明
- 路径修正:你原代码里的CSV路径末尾多了一个反斜杠,会导致文件找不到,已经修正为正确的文件路径格式。
- 字段安全分割:用
split(",",4)限制分割次数,确保最后一列(即使意外包含逗号)不会被拆分成多个字段,保证4个字段的完整性。 - 资源自动管理:使用
try-with-resources语法,无需手动关闭Scanner和BufferedWriter,避免资源泄漏。 - 异常处理:捕获了常见的文件未找到、IO异常,给出清晰的错误提示,方便排查问题。
可自定义调整点
- 如果你的文本模板是一个已存在的本地文件,可先将模板内容读取到字符串中再进行替换。
- 若需要对Code2的分号值做更复杂处理(比如每行输出一个编码),可以用
code2Raw.split(";")转成数组,遍历生成多行内容。 - 如果CSV字段包含带引号的逗号(例如
"2024-01-01", "ABC,123", ...),可以添加引号处理逻辑,不过当前代码已覆盖你描述的基础场景。
内容的提问来源于stack exchange,提问作者val
相关产品推荐
相关产品推荐

