Java 在双引号对外的逗号上拆分。如果是单引号,则忽略双引号

Java 在双引号对外的逗号上拆分。如果是单引号,则忽略双引号,java,regex,string,csv,split,Java,Regex,String,Csv,Split,我有两种类型的字符串,需要使用逗号进行拆分 第一类(1”表示1英寸) 第二类 130,"TEXT, SAMPLE TEXT",400,4,1,998,.010,9,-,7,130 在第一种类型中,我需要将字符串保持原样,并使用, 因此,我的分割值将是130和文本1“67系列,依此类推 但在第二种类型中,我需要忽略双引号之间的逗号,并将字符串作为一个整体 我用这个分开了 a.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") 通过了第二个案例,但第一个案例失败

我有两种类型的字符串,需要使用逗号进行拆分

第一类(1”表示1英寸)

第二类

130,"TEXT, SAMPLE TEXT",400,4,1,998,.010,9,-,7,130
在第一种类型中,我需要将字符串保持原样,并使用, 因此,我的分割值将是130和文本1“67系列,依此类推

但在第二种类型中,我需要忽略双引号之间的逗号,并将字符串作为一个整体

我用这个分开了

a.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")
通过了第二个案例,但第一个案例失败。请帮助

我不知道如何(如果有的话)使用单个正则表达式来完成。但是这里有一种蛮力方法,它计算字符串中引号的数量并从那里开始

public static void main(String[] args) {
    System.out.println("---Type 1---");
    for (String s : split("130,TEXT 1\" 67 SERIES ,400,4,1,998,.010,9,-,7,130")) {
        System.out.println(s);
    }
    System.out.println("\n---Type 2---");
    for (String s : split("130,\"TEXT, SAMPLE TEXT\",400,4,1,998,.010,9,-,7,130")) {
        System.out.println(s);
    }
}

private static List<String> split(String str) {
    List<String> tokens = new ArrayList<>();
    if (str.split("\"").length > 2) {
        int firstQuoteIndex = str.indexOf("\"");
        int secondQuoteIndex = str.indexOf("\"", firstQuoteIndex + 1);
        tokens.add(str.substring(0, firstQuoteIndex - 1));
        tokens.add(str.substring(firstQuoteIndex + 1, secondQuoteIndex));
        tokens.addAll(Arrays.asList(str.substring(secondQuoteIndex + 2).split(",")));
    } else {
        tokens.addAll(Arrays.asList(str.split(",")));
    }
    return tokens;
}

您的输入格式不是有效的CSV格式。根据维基百科页面,如果使用了引号,则必须引用字段中的文字引号字符

这意味着任何现有的通用CSV解析器库都不太可能处理同一文件中的两种类型的行

为了说明这个问题有多严重,请考虑:

   130,TEXT 1" 67 SERIES, TEXT 2",4,1,998,.010,9,-,7,130
这可能意味着:

  • 一个字段包含
    TEXT 1“67系列,TEXT 2”
  • 一个包含
    文本1 67系列、文本2
  • 两个字段
    TEXT 1“67系列
    TEXT 2”
消除歧义的唯一方法是编写一些自定义逻辑来进行排序。。。。基于您自己的业务规则

我认为用
split
和正则表达式无法做到这一点。您需要编写一个适当的自定义解析器

但在这种情况下,我认为您有权拒绝创建此CSV数据的任何人/任何人。他们应该遵守规则。我很想实现我的系统,通过现成的语法检查器向CSV文件提供信息,并自动拒绝任何未通过验证的文件


你能修正自动报价中的错误吗?我想不是。。。在一般情况下。如前所述,无法判断格式错误的CSV中的双引号是否应该是文字。它需要人类智能和领域知识来理解数据的含义。

您可以使用
csv
解析器。是的,该文件来自遗留系统,我们无法更改。正在为所有角落案例进行自定义解析的逻辑。即使是旧系统也可以更改。我无法控制这些。所以这是无法改变的。无论我收到什么,我都要处理
---Type 1---
130
TEXT 1" 67 SERIES 
400
4
1
998
.010
9
-
7
130

---Type 2---
130
TEXT, SAMPLE TEXT
400
4
1
998
.010
9
-
7
130
   130,TEXT 1" 67 SERIES, TEXT 2",4,1,998,.010,9,-,7,130