Java 在双引号对外的逗号上拆分。如果是单引号,则忽略双引号
我有两种类型的字符串,需要使用逗号进行拆分 第一类(1”表示1英寸) 第二类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(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") 通过了第二个案例,但第一个案例失败
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