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