我有两种类型的字符串,需要用逗号分割
第一种类型(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(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)")
通过了第二种情况,但在第一种情况下失败。请帮助
答案 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 SERIES
和TEXT 2"
。唯一的消除歧义的方法是编写一些自定义逻辑,以便根据您自己的业务规则对其进行分类。
我认为您不能使用split
和正则表达式来做到这一点。您需要编写适当的自定义解析器。
但是在这种情况下,我认为您有权取消创建此CSV数据的任何人。他们应该遵守规则。我很想实现我的系统,以通过现成的语法检查器提供CSV文件,并自动拒绝任何未通过验证的文件。
您可以解决自动报价中的错误吗?我认为不是……在一般情况下。如前所述,无法判断格式错误的CSV中的双引号是否应该是文字。它需要人类情报和领域知识才能理解数据的含义。