日期:2014-05-20  浏览次数:20756 次

高手高高手请进:JAVA解析CSV文件
首先说明:本人已经用过正则,opencsv(apache的),javacsv2.0(商业的).... try过无数次,都无法搞定!!
请不要告诉我用上述办法,甚至String.split(",")。。。这样最原始的搞法,因为我都试过

其实我的需求就一样事情:如何处理csv数据中包含的逗号??如果不是这个原因我也不会发这个帖子了。。。

略略贴一贴正则的:

Java code
        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输出的也都不符合我的要求。其实主要就是红色部分不符合。

特发帖求解!!!



------解决方案--------------------
csv 用excel打开 再导到数据库里
------解决方案--------------------
你应该修改你的源文件,修改成为符合标准CSV文件的格式:
Java code
CSV逗号分隔值文件
  规则
  0 开头是不留空,以行为单位。
  1 可含或不含列名,含列名则居文件第一行。
  2 一行数据不垮行,无空行。
  3 以半角符号,作分隔符,列为空也要表达其存在。
  4 列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
  5 列内容如存在半角引号(即")则应替换成半角双引号("")转义。
  6 文件读写时引号,逗号操作规则互逆。
  7 内码格式不限,可为ASCII、Unicode或者其他。

------解决方案--------------------
建议使用smooks这个插件。可以解析csv,xml,edi,flatfile等等。具体情况google一下吧。
------解决方案--------------------
我觉得可以不用csv格式的,直接xls格式保存数据
然后用POI来操作excel
------解决方案--------------------
Java code

        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 + "]");
        }

------解决方案--------------------
探讨
不过该问题已经曲线解决了。如同楼上有人说的,另存为XLS + POI...