使用Java实现单列数据拆分为多列,解决引号内逗号误拆分问题
CSV列拆分Java实现方案
实现思路
针对双引号包裹内容中逗号不被识别为分隔符的需求,本质是要兼容标准CSV格式的解析规则,有两种可选实现路径:
方案一:使用开源CSV解析库(推荐)
开源库已覆盖引号嵌套、转义字符等所有CSV边界场景,无需重复处理异常逻辑,以opencsv为例:
- 引入Maven依赖
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.6</version> </dependency>
- 代码实现
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
相关产品推荐
相关产品推荐

