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

Java读取含多行数据的自定义分隔符CSV并插入数据库的问题

解决CSV含多行字段时的读取问题及入库最佳实践

你手动用BufferedReader+split解析CSV的方式,没法处理字段包含多行内容的场景——因为readLine()会把多行字段的换行当成行分隔符,直接截断字段内容,导致后续解析全乱。

CSV格式有自身规范(比如带特殊字符/换行的字段通常会用引号包裹),手动解析很难覆盖所有边界情况,最稳妥的方式是用成熟的CSV解析库,以下是两种常用方案:

Apache Commons CSV

这个库能自动处理多行字段、引号转义等场景,指定分隔符为^即可:

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.io.Reader;

public class CsvReader {
    public static void main(String[] args) throws Exception {
        // 指定分隔符为^,启用引号包裹字段的解析规则
        CSVFormat format = CSVFormat.DEFAULT.withDelimiter('^').withQuote('"').withHeader();
        
        try (Reader reader = new FileReader("/tmp/s_nq_acct.csv");
             CSVParser parser = format.parse(reader)) {
            
            for (CSVRecord record : parser) {
                String user_name = record.get("user_name"); // 假设表头包含user_name
                String repository_name = record.get("repository_name");
                // 读取其他字段...
                // 此处record已自动处理多行字段,可直接获取完整内容
            }
        }
    }
}

OpenCSV

另一个常用的CSV解析库,同样支持自定义分隔符和多行字段解析:

import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import java.io.FileReader;

public class OpenCsvReader {
    public static void main(String[] args) throws Exception {
        try (CSVReader reader = new CSVReaderBuilder(new FileReader("/tmp/s_nq_acct.csv"))
                .withSeparator('^') // 指定分隔符
                .build()) {
            
            String[] header = reader.readNext(); // 读取表头
            String[] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                String user_name = nextLine[0];
                String repository_name = nextLine[1];
                // 读取其他字段...
                // 多行字段会被自动拼接为完整字符串
            }
        }
    }
}

CSV入库最佳实践

  • 解析完成后,用批量插入替代单条插入,比如JDBC的addBatch()+executeBatch(),或ORM框架的批量操作,能大幅提升效率
  • 入库前做字段校验(非空、格式验证等),避免脏数据进入数据库
  • 若CSV文件体积极大,可分块读取+分批次入库,避免内存溢出

注:如果你的CSV中多行字段未用引号包裹,属于不符合规范的CSV,建议先调整生成规则,用引号包裹含特殊字符/换行的字段,否则任何解析库都难以准确识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:05:07