解析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 readCsvFile(String argPath)

            throws FileNotFoundException, IOException {

        CsvFileUtil util = new CsvFileUtil();

        File cvsFile = new File(argPath);

        ArrayList list = new ArrayList();

        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 listTemp = new ArrayList();

                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;

    }

 

 

你可能感兴趣的:(解析CSV文件)