我将以下行逗号分隔,
LanguageID=0,LastKnownPeriod="Active",c_MultiPartyCall={Counter=1,TimeStamp=1394539271448},LTH={Data=["1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||","1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||"}
使用split方法,我可以获得逗号分隔值,但实际问题出现在文本c_MultiPartyCall={Counter=1,TimeStamp=1394539271448}
,因为在其中找到了逗号。
所以分裂后的单词应该是,
LanguageID=0
LastKnownPeriod="Active"
c_MultiPartyCall={Counter=1,TimeStamp=1394539271448}
(再次在单词中找到逗号)LTH={Data=["1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||","1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||"}
(在大括号中的单词中再次找到逗号)我尝试使用以下代码,但没有工作:
String arr[]=input_line.split("(.*!{),(.*!})");
for (int i=0;i<arr.length;i++)
System.out.println(arr[i]);
请告知。
答案 0 :(得分:1)
首先,只是分割逗号不是CSV的工作原理
a,b,"c,d"
只有三个值a
,b
和c,d
。我建议使用CSV解析器,例如opencsv。 CSV并不是非常复杂,但它并不像逗号分割那么简单。
其次,您的CSV数据无效,因为您在一个未引用的字段中有引号和逗号。
在其他方面,如果您想要值a
,b","c
,那么CSV就是
a,"b"",""c"
(请注意引号是双重转义。)
否则,无法分辨出您真正想要的字段。 CSV解析器会阻塞您的数据。
答案 1 :(得分:1)
改为使用正则表达式:
([\w_]+=(?:\{[\w=_,\[\]"\|:\.\s-]*\}))|([^,]+)
这会将该行分为4个部分:
代码:
import java.util.regex.*;
public class JavaRegEx {
public static void main(String[] args) {
String line = "LanguageID=0,LastKnownPeriod=\"Active\",c_MultiPartyCall={Counter=1,TimeStamp=1394539271448},LTH={Data=[\"1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||\",\"1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||\"}";
Pattern pattern = Pattern.compile("([\\w_]+=(?:\\{[\\w=_,\\[\\]\"\\|:\\.\\s-]*\\}))|([^,]+)");
Matcher matcher = pattern.matcher(line);
while(matcher.find())
System.out.println(matcher.group(0));
}
}
答案 2 :(得分:1)
虽然可以通过split()
执行此操作,但匹配实际令牌(split()
匹配令牌之间的分隔符更容易) )。你的标记都包含一个或多个除逗号或大括号之外的任何字符,后面还有一对大括号包含一些非大括号字符(可以包括逗号):
[^,{}]+(?:\{[^{}]+\})?
它的Java代码是:
List<String> matchList = new ArrayList<String>();
Pattern p = Pattern.compile("[^,{}]+(?:\\{[^{}]+\\})?");
Matcher m = p.matcher(s);
while (m.find()) {
matchList.add(m.group());
}
但看起来你可以进一步分解它:
Pattern p = Pattern.compile("(\\w+)=([^,{}]+|\\{[^{}]+\\})");
Matcher m = p.matcher(TEST_STR);
while (m.find()) {
System.out.printf("%nname = %s%nvalue = %s%n",
m.group(1), m.group(2));
}
输出:
name = LanguageID
value = 0
name = LastKnownPeriod
value = "Active"
name = c_MultiPartyCall
value = {Counter=1,TimeStamp=1394539271448}
name = LTH
value = {Data=["1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakAccountID|0|1000||","1|MTC|01.01.1970 15:00:00|0.0|7|-1|OnPeakA
ccountID|0|1000||"}