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

Java实现读取CSV行并写入文本文件指定位置(无外部依赖)

纯Java实现CSV读取并填充到文本指定位置(无外部依赖)

我来帮你把这个需求落地,纯用Java原生API就能完成,不用引入任何外部JAR包。结合你给出的Scanner开头代码,咱们一步步实现:

核心思路

  1. 用Scanner逐行读取CSV文件,处理每行的逗号分隔字段
  2. 单独处理最后一列(Code2)的分号分隔值
  3. 定义文本模板,将每个字段替换到模板的指定位置
  4. 将填充后的内容写入目标文本文件

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:21:03