解析csv文件
现在主流的文件上传和导入的文件主要有excel和csv。Excel文件解析网上有2中主流的解释方式:POI和JXL,我用的是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();
}
这些正则我目前看的稀里糊涂,有待以后慢慢研究……
这里还需要用到2个java类Pattern和Matcher
Pattern把指定的正则表达式编译成该类的实例,利用该实例(模型)创建一个Matcher匹配器
把正则编译成实例Pattern p = Pattern.compile(String reg);
通过模型创建匹配器Matcher m = p.matcher(String str);并把需要匹配的字符串传进去
通过调用Matcher的find()判断是否还有子字符串匹配正则,如果要获取匹配后的子字符串可调用Matcher的group()方法获取。下面代码演示了具体操作:
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;
}