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

使用Java实现单列数据拆分为多列,解决引号内逗号误拆分问题

CSV列拆分Java实现方案

实现思路

针对双引号包裹内容中逗号不被识别为分隔符的需求,本质是要兼容标准CSV格式的解析规则,有两种可选实现路径:

方案一:使用开源CSV解析库(推荐)

开源库已覆盖引号嵌套、转义字符等所有CSV边界场景,无需重复处理异常逻辑,以opencsv为例:

  1. 引入Maven依赖
<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>
  1. 代码实现
import com.opencsv.CSVReader;
import java.io.StringReader;
import java.util.List;

public class CsvSplitDemo {
    public static void main(String[] args) {
        // 模拟输入数据集
        List<String> inputList = List.of(
                "abc,\"test,data\",valid",
                "xyz,\"sample,data\",invalid"
        );
        // 输出表头
        System.out.println("Col1|Col2|Col3");
        for (String line : inputList) {
            try (CSVReader csvReader = new CSVReader(new StringReader(line))) {
                String[] columns = csvReader.readNext();
                // 若需将第二列逗号替换为下划线,新增 columns[1] = columns[1].replace(',', '_'); 即可
                System.out.printf("%s|\"%s\"|%s%n", columns[0], columns[1], columns[2]);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

方案二:自定义正则实现(无第三方依赖场景)

轻量场景可通过正则匹配区分引号包裹内容和普通内容,无需引入依赖:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CustomCsvSplit {
    // 正则规则:优先匹配双引号包裹的内容,再匹配普通非逗号内容
    private static final Pattern CSV_COLUMN_PATTERN = Pattern.compile("\"([^\"]*)\"|([^,]+)");

    public static void main(String[] args) {
        List<String> inputList = List.of(
                "abc,\"test,data\",valid",
                "xyz,\"sample,data\",invalid"
        );
        System.out.println("Col1|Col2|Col3");
        for (String line : inputList) {
            Matcher matcher = CSV_COLUMN_PATTERN.matcher(line);
            List<String> columns = new ArrayList<>();
            while (matcher.find()) {
                if (matcher.group(1) != null) {
                    // 引号包裹内容,保留引号格式
                    String colValue = matcher.group(1);
                    // 需替换逗号为下划线则取消下一行注释
                    // colValue = colValue.replace(',', '_');
                    columns.add("\"" + colValue + "\"");
                } else {
                    columns.add(matcher.group(2));
                }
            }
            System.out.println(String.join("|", columns));
        }
    }
}

输出效果

两种方案执行后均可得到预期结果:

Col1|Col2|Col3
abc|"test,data"|valid
xyz|"sample,data"|invalid

若需要将第二列内的逗号替换为下划线,按照代码注释新增替换逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:15:02