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
相关产品推荐
相关产品推荐

