首先说明:本人已经用过正则,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输出的也都不符合我的要求。其实主要就是红色部分不符合。特发帖求解!!!

解决方案 »

  1.   

    csv  用excel打开 再导到数据库里
      

  2.   

    你应该修改你的源文件,修改成为符合标准CSV文件的格式:
    CSV逗号分隔值文件
      规则
      0 开头是不留空,以行为单位。
      1 可含或不含列名,含列名则居文件第一行。
      2 一行数据不垮行,无空行。
      3 以半角符号,作分隔符,列为空也要表达其存在。
      4 列内容如存在半角逗号(即,)则用半角引号(即"")将该字段值包含起来。
      5 列内容如存在半角引号(即")则应替换成半角双引号("")转义。
      6 文件读写时引号,逗号操作规则互逆。
      7 内码格式不限,可为ASCII、Unicode或者其他。 
    然后用标准CSV库解析。比如XML,<xxx="<>">没有那种解析引擎可以解析这样的东西
      

  3.   

    建议使用smooks这个插件。可以解析csv,xml,edi,flatfile等等。具体情况google一下吧。
      

  4.   

    像你这样的,是需求有问题,如果数据中有大量的逗号,干嘛还要用csv格式?
    换成"|"或者tsv格式都可以,甚至xml格式
    你这是自寻死路!
      

  5.   

    我觉得可以不用csv格式的,直接xls格式保存数据
    然后用POI来操作excel
      

  6.   


    犀利哥吗?言辞好犀利,嘎嘎帅哥,问题是这个CSV并非我生成的,而是其他系统导出的,是不是要推动别人去修改它的代码啊CSV生成很容易,解析就难了,就像MD5.。。不过该问题已经曲线解决了。如同楼上有人说的,另存为XLS + POI...而且感觉该问题肯定有解,否则EXCEL怎么能正确打开CSV
      

  7.   


    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]
      

  8.   


    如果楼主是手工把cvs另存为xls,那问题似乎还是没有完美解决。
      

  9.   

    不对吧如果字段中含有逗号,那么这个字段用引号包起来,如果字段中含有引号,那就使用两个引号进行转义。你示例的 CSV 中,有两个引号的,为什么没有看“应该”当中有引号啊?
      

  10.   


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

  11.   

    10楼的输出还是不对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]N73,8250,N97,E61,E71,5320,8855,6210C,N95 没在一行上
      

  12.   

    算了不等了,下班结贴。3楼说的要规范CSV输出,这个不是我说了算。这个格式的CSV是另一个系统做的,与其推动其修改CSV,不如直接让它导出XLS。POI直接解析。无论你什么样的CSV,只要告诉MS的EXCEL它的分隔符是什么,他都可以正确解析。纳了闷了另外,据说ms 的sql server可以直接用sql语句将xls文件导入数据库。其他数据库应该不支持吧?毕竟xls是ms 的东西
      

  13.   

    10楼的regex改成
    String regex = "((\"[^\"]*(\"{2})*[^\"]*\")*[^,]*)(,)";
    就可以了。lz可以试一试