解析CSV文件

解析csv文件

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

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

privatestaticfinalStringSPECIAL_CHAR_A="[^/",//n]";

 

privatestaticfinalStringSPECIAL_CHAR_B="[^/",//n]";

 

   privateString getRegExp() {

       StringBuffer strRegExps =newStringBuffer();

       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("*[]*");

       returnstrRegExps.toString();

   }

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

 

这里还需要用到2javaPatternMatcher

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

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

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

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

publicstaticArrayList<String[]> readCsvFile(String argPath)

           throwsFileNotFoundException, IOException {

       CsvFileUtil util =newCsvFileUtil();

       File cvsFile =newFile(argPath);

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

       FileReader fileReader =null;

       BufferedReader bufferedReader =null;

       try{

           fileReader =newFileReader(cvsFile);

           bufferedReader =newBufferedReader(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 =newArrayList<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(newString[listTemp.size()]));

           }

       }

       catch(FileNotFoundException e) {

           throwe;

       }

       catch(IOException e) {

           throwe;

       }

       finally{

           try{

               if(bufferedReader !=null) {

                   bufferedReader.close();

               }

               if(fileReader !=null) {

                   fileReader.close();

               }

           }

           catch(IOException e) {

               throwe;

           }

       }

       returnlist;

   }

 

 


版权声明:本文为liuyuan_java原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。