csv格式数据正则匹配以及校验

最近接到一个需求,需要在数据库中配置按照csv格式配置数据,并将获取的数据通过正则表达式进行切分处理。
这个需求主要是因为最近项目要加一个数据表达式解析框架jeval,要处理的数据可能包含各种特殊字符,没有一个简单通用的模板可以使用。(具体这个框架的使用我另起一篇来实现)

有些人可能说自己可以自定义一个函数实现字符串数据的切分,理论上这样是可以的 ,主要你的分隔符足够复杂,另外这样还有风险是不能确保你要切割的字符串不会包含这种特殊字符。

正则划分csv我网上找了一个正则表达式,亲测有效。博客链接如下:正则切分csv文件
核心代码如下

 public static List<String> splitCSV(String txt) {

        String reg = "\\G(?:^|,)(?:\"([^\"]*+(?:\"\"[^\"]*+)*+)\"|([^\",]*+))";
        // 即 \G(?:^|,)(?:"([^"]*+(?:""[^"]*+)*+)"|([^",]*+))

        Matcher matcherMain = Pattern.compile(reg).matcher(txt);
        Matcher matcherQuoto = Pattern.compile("\"\"").matcher("");

      //  matcherMain.reset(txt)
        //  System.out.println(matcherMain.groupCount());
        List strList = new ArrayList();
        while (matcherMain.find()) {
            String field;
            if (matcherMain.start(2) >= 0) {
                field = matcherMain.group(2);
            } else {
                field = matcherQuoto.reset(matcherMain.group(1)).replaceAll("\"");
            }
            strList.add(field);
        }
        return strList;
    }

刚开始同事拿到这个正则发现老是切割的不对,即不能通过这个正则切割出自己预料的结果。
有两种可能:
1、配置的测试数据不是csv格式数据,导致正则切割的有问题
2、本来这个正则表达式就有问题,导致我们配置的数据无法正确切割
为了验证第一种情况,首先需要了解csv格式的数据都有神马特点,特别是对于一些复杂的,比如包含换行符,逗号,双引号,单引号之类的我们数据该如何配置才能保证正确切割。
网上上了几篇博客,大致汇总如下:
具体文件格式:

  1. 每条记录占一行 以逗号为分隔符
  2. 逗号前后的空格会被忽略
  3. 字段中包含有逗号,该字段必须用双引号括起来
  4. 字段中包含有换行符,该字段必须用双引号括起来
  5. 字段前后包含有空格,该字段必须用双引号括起来
  6. 字段中的双引号用两个双引号表示
  7. 字段中如果有双引号,该字段必须用双引号括起来
  8. 第一条记录,可以是字段名

我认真研读逐条研读了上面的内容,然后配置后发现自己配置的复杂表达式切割出来还是有问题。最后实在看不出自己哪一步错了,就自己创建了一个csv文件。把自己期望要切割的demo配置逐条配置在csv文件中。保存后用notepad++打开这个文件可以看到经过格式化的配置内容。
在这里插入图片描述
在这里插入图片描述
最后发现是我要切割的字符串里面的双引号需要变成两个双引号。
知道问题后就好处理了,我会在每次切割之前先把数据里面的一个双引号用字符串替换函数替换成两个双引号,最后组装配置后进行切割,发现结果满足预期。
关于csv格式描述,参考了下面的博客
csv格式描述博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章