解析CSV文件

解析csv文件

现在主流的文件上传和导入的文件主要有excelcsvExcel文件解析网上有2中主流的解释方式:POIJXL,我用的是POI解析,由于excel版本有差异,导致在解析不同版本excle文件时使用了不同的解析类,这是excel很不好的一个地方,csv无版本差异,解析方法必须自己写(网上没找到现成的包),这是比较头疼的事,尤其是导入数据可能存在特殊字符和对JAVA正则表达式不熟悉的人老说写正则表达式是非常恶心的一件事。

现在我将某位牛人写好的一个正则提供给大家,对一般需求已经足够用了

private static final String SPECIAL_CHAR_A = "[^/",//n  ]";

 

private static final String SPECIAL_CHAR_B = "[^/",//n]";

 

    private String getRegExp() {

        StringBuffer strRegExps = new StringBuffer();

        strRegExps.append("/"((");

        strRegExps.append(SPECIAL_CHAR_A);

        strRegExps.append("*[,//n  ])*(");

        strRegExps.append(SPECIAL_CHAR_A);

        strRegExps.append("*/"{2})*)*");

        strRegExps.append(SPECIAL_CHAR_A);

        strRegExps.append("*/"[  ]*,[  ]*");

        strRegExps.append("|");

        strRegExps.append(SPECIAL_CHAR_B);

        strRegExps.append("*[  ]*,[  ]*");

        strRegExps.append("|/"((");

        strRegExps.append(SPECIAL_CHAR_A);

        strRegExps.append("*[,//n  ])*(");

        strRegExps.append(SPECIAL_CHAR_A);

        strRegExps.append("*/"{2})*)*");

        strRegExps.append(SPECIAL_CHAR_A);

        strRegExps.append("*/"[  ]*");

        strRegExps.append("|");

        strRegExps.append(SPECIAL_CHAR_B);

        strRegExps.append("*[  ]*");

        return strRegExps.toString();

    }

这些正则我目前看的稀里糊涂,有待以后慢慢研究……

 

这里还需要用到2javaPatternMatcher

Pattern把指定的正则表达式编译成该类的实例,利用该实例(模型)创建一个Matcher匹配器

把正则编译成实例Pattern  p = Pattern.compile(String reg);

通过模型创建匹配器 Matcher  m = p.matcher(String str);并把需要匹配的字符串传进去

通过调用Matcherfind()判断是否还有子字符串匹配正则,如果要获取匹配后的子字符串可调用Matchergroup()方法获取。下面代码演示了具体操作:

public static ArrayList<String[]> readCsvFile(String argPath)

            throws FileNotFoundException, IOException {

        CsvFileUtil util = new CsvFileUtil();

        File cvsFile = new File(argPath);

        ArrayList<String[]> list = new ArrayList<String[]>();

        FileReader fileReader = null;

        BufferedReader bufferedReader = null;

        try {

            fileReader = new FileReader(cvsFile);

            bufferedReader = new BufferedReader(fileReader);

            String regExp = util.getRegExp();

           

            String strLine = "";

            String str = "";

            while ((strLine = bufferedReader.readLine()) != null) {

                Pattern pattern = Pattern.compile(regExp);

                Matcher matcher = pattern.matcher(strLine);

                List<String> listTemp = new ArrayList<String>();

                while (matcher.find()) {

                    str = matcher.group();

                    str = str.trim();  //注意这里获取的子字符串是带分隔符的

                    if (str.endsWith(",")) {

                        str = str.substring(0, str.length() - 1);

                        str = str.trim();

                    }

                    if (str.startsWith("/"") && str.endsWith("/"")) {

                        str = str.substring(1, str.length() - 1);

                        if (util.isExisted("/"/"", str)) {

                            str = str.replaceAll("/"/"", "/"");

                        }

                    }

                    listTemp.add(str);

                }

                // test

                list.add((String[]) listTemp

                        .toArray(new String[listTemp.size()]));

            }

        }

        catch (FileNotFoundException e) {

            throw e;

        }

        catch (IOException e) {

            throw e;

        }

        finally {

            try {

                if (bufferedReader != null) {

                    bufferedReader.close();

                }

                if (fileReader != null) {

                    fileReader.close();

                }

            }

            catch (IOException e) {

                throw e;

            }

        }

        return list;

    }

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泡壶好茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值