首先说明:本人已经用过正则,opencsv(apache的),javacsv2.0(商业的).... try过无数次,都无法搞定!!
请不要告诉我用上述办法,甚至String.split(",")这样最原始的搞法,因为我都试过其实我的需求就一样事情:如何处理csv数据中包含的逗号??如果不是这个原因我也不会发这个帖子了略略贴一贴正则的: String str = "7,,08020056,,C.3,-,P,SYMBIAN,\"\"NOKIA,SAMSUNG,Sony Erission\"\",9.0,NPS,\"\"N73,8250,N97,E61,E71,5320,8855,6210C,N95\"\",";
String regex = "\\G(?:^|,)(?:\"([^\"]*+(?:\"\"[^\"]*+)*+)\"|([^\",]*+))";
Matcher main = Pattern.compile(regex).matcher(str);
Matcher mquote = Pattern.compile("\"\"").matcher("");
while (main.find()) {
String field;
if (main.start(2) >= 0) {
field = main.group(2);
} else {
field = mquote.reset(main.group(1)).replaceAll("\"");
}
System.out.println("Field [" + field + "]");
}正常情况下, str解析出来的东东应该是这样(数据用[]包含起来):
[7],[],[08020056],[],[C.3],[-],[P],[SYMBIAN],[NOKIA,SAMSUNG,SonyErission],[9.9],[NPS],[N73,8250,N97,E61,5320,8855,6210C,N95]
但上述正则输出的不是这个内容,而且opencsv,javacsv2输出的也都不符合我的要求。其实主要就是红色部分不符合。特发帖求解!!!
请不要告诉我用上述办法,甚至String.split(",")这样最原始的搞法,因为我都试过其实我的需求就一样事情:如何处理csv数据中包含的逗号??如果不是这个原因我也不会发这个帖子了略略贴一贴正则的: String str = "7,,08020056,,C.3,-,P,SYMBIAN,\"\"NOKIA,SAMSUNG,Sony Erission\"\",9.0,NPS,\"\"N73,8250,N97,E61,E71,5320,8855,6210C,N95\"\",";
String regex = "\\G(?:^|,)(?:\"([^\"]*+(?:\"\"[^\"]*+)*+)\"|([^\",]*+))";
Matcher main = Pattern.compile(regex).matcher(str);
Matcher mquote = Pattern.compile("\"\"").matcher("");
while (main.find()) {
String field;
if (main.start(2) >= 0) {
field = main.group(2);
} else {
field = mquote.reset(main.group(1)).replaceAll("\"");
}
System.out.println("Field [" + field + "]");
}正常情况下, str解析出来的东东应该是这样(数据用[]包含起来):
[7],[],[08020056],[],[C.3],[-],[P],[SYMBIAN],[NOKIA,SAMSUNG,SonyErission],[9.9],[NPS],[N73,8250,N97,E61,5320,8855,6210C,N95]
但上述正则输出的不是这个内容,而且opencsv,javacsv2输出的也都不符合我的要求。其实主要就是红色部分不符合。特发帖求解!!!
解决方案 »
- 用java写一个socket 程序来抓取某个url的内容并且将url内容保存到本地
- 一个对象多个线程和多个对象多个线程的实际应用例子有高手来举例几个吗?
- 关于"云计算",你有什么看法
- 登陆界面如何进入到主界面?
- 为什么覆盖方法时,不能使用比父类中被覆盖的方法更严格的访问权限?
- 什么情况下finally的代码不会执行到?
- 由access导出txt的数据文件,怎么用程序识别文件,并把txt里面的字段识别出来呢!(txt里面有格式)
- JavaSoundAudioClip这个类在哪里可以找到啊?
- 求救
- 请问构造方法是不是默认就生成了不需要编写?
- 求高手.java文件怎么生成API文档
- isReachable方法的基础问题
CSV逗号分隔值文件
规则
0 开头是不留空,以行为单位。
1 可含或不含列名,含列名则居文件第一行。
2 一行数据不垮行,无空行。
3 以半角符号,作分隔符,列为空也要表达其存在。
4 列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
5 列内容如存在半角引号(即")则应替换成半角双引号("")转义。
6 文件读写时引号,逗号操作规则互逆。
7 内码格式不限,可为ASCII、Unicode或者其他。
然后用标准CSV库解析。比如XML,<xxx="<>">没有那种解析引擎可以解析这样的东西
换成"|"或者tsv格式都可以,甚至xml格式
你这是自寻死路!
然后用POI来操作excel
犀利哥吗?言辞好犀利,嘎嘎帅哥,问题是这个CSV并非我生成的,而是其他系统导出的,是不是要推动别人去修改它的代码啊CSV生成很容易,解析就难了,就像MD5.。。不过该问题已经曲线解决了。如同楼上有人说的,另存为XLS + POI...而且感觉该问题肯定有解,否则EXCEL怎么能正确打开CSV
String str = "7,,08020056,,C.3,-,P,SYMBIAN,\"\"NOKIA,SAMSUNG,Sony Erission\"\",9.0,NPS,\"\"N73,8250,N97,E61,E71,5320,8855,6210C,N95\"\",";
String regex = "([^,]*)(,)";
Matcher main = Pattern.compile(regex).matcher(str);
while (main.find()) {
String field;
field = main.group(1).replaceAll("\"","");
System.out.println("Field [" + field + "]");
}
Field [7]
Field []
Field [08020056]
Field []
Field [C.3]
Field [-]
Field [P]
Field [SYMBIAN]
Field [NOKIA]
Field [SAMSUNG]
Field [Sony Erission]
Field [9.0]
Field [NPS]
Field [N73]
Field [8250]
Field [N97]
Field [E61]
Field [E71]
Field [5320]
Field [8855]
Field [6210C]
Field [N95]
如果楼主是手工把cvs另存为xls,那问题似乎还是没有完美解决。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test20100607 { /**
* @param args
*/
public static void main(String[] args) {
String str = "7,,08020056,,C.3,-,P,SYMBIAN,\"\"NOKIA,SAMSUNG,Sony Erission\"\",9.0,NPS,\"\"N73,8250,N97,E61,E71,5320,8855,6210C,N95\"\",";
String regex = "([^,]*)(,)";
Matcher main = Pattern.compile(regex).matcher(str);
while (main.find()) {
String field;
field = main.group(1).replaceAll("\"","");
System.out.println("Field [" + field + "]");
} }}
Field []
Field [08020056]
Field []
Field [C.3]
Field [-]
Field [P]
Field [SYMBIAN]
Field [NOKIA]
Field [SAMSUNG]
Field [Sony Erission]
Field [9.0]
Field [NPS]
Field [N73]
Field [8250]
Field [N97]
Field [E61]
Field [E71]
Field [5320]
Field [8855]
Field [6210C]
Field [N95]N73,8250,N97,E61,E71,5320,8855,6210C,N95 没在一行上
String regex = "((\"[^\"]*(\"{2})*[^\"]*\")*[^,]*)(,)";
就可以了。lz可以试一试