在双引号外使用逗号分隔。如果是单引号,则忽略双引号

时间:2019-02-12 05:36:25

标签: java regex string csv split

我有两种类型的字符串,需要用逗号分割

第一种类型(1英寸表示1英寸)

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

第二类型

130,"TEXT, SAMPLE TEXT",400,4,1,998,.010,9,-,7,130

在第一种类型中,我需要直接使用字符串并使用进行分割, 因此我的拆分值为130,TEXT 1“ 67 SERIES,依此类推。

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

我用这个分开

a.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")

通过了第二种情况,但在第一种情况下失败。请帮助

2 个答案:

答案 0 :(得分:0)

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

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;
}

输出

---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

答案 1 :(得分:0)

您输入的格式不是有效的CSV格式。根据Wikipedia Comma-separated values页的介绍,如果根本不使用引号,则必须在字段必须中使用文字引号。

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

要说明此问题的严重程度,请考虑:

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

这可能意味着:

  • 一个包含TEXT 1" 67 SERIES, TEXT 2"的字段
  • 一个包含TEXT 1 67 SERIES, TEXT 2的字段,或
  • 两个字段TEXT 1" 67 SERIESTEXT 2"

唯一的消除歧义的方法是编写一些自定义逻辑,以便根据您自己的业务规则对其进行分类。

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

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

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