CSV文件解析

时间:2023-03-08 19:19:53

CSV(逗号分隔值文件格式)

       逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。CSV文件格式的通用标准并不存在,但是在RFC 4180中有基础性的描述。使用的字符编码同样没有被指定,但是7-bitASCII是最基本的通用编码。
      java解析CSV文件的通用方法:
      其它辅组类参考   http://www.cnblogs.com/wshsdlau/p/5643862.html
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import com.boguan.bte.service.common.IExcelRowReader; /**
* 名称: CsvParser.java<br>
* 描述: <br>
* 类型: JAVA<br>
* 最近修改时间:2016年7月6日 上午10:22:34<br>
*
* @since 2016年7月6日
* @author
*/
public class CsvReader { /**
* Space mark , ; : etc.
*/
private String spaceMark = ","; /**
* CSV固定只有SHEET_NUM=0
*/
private final static int SHEET_NUM = ; /**
* Contructor
*
* @param inputCsvFile
*/
public CsvReader() {
} /**
* 行读取
*/
private IExcelRowReader rowReader; public void setRowReader(IExcelRowReader rowReader) {
this.rowReader = rowReader;
} /**
* 从CSV文件中获取数组
*
* @return
* @throws IOException
*/
public void process(String inputCsvFile) throws IOException {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(inputCsvFile));
List<List<String>> retval = new ArrayList<List<String>>();
String regExp = getRegExp();
String strLine;
String str = "";
int rowNum = ;
List<String> listTemp = null;
while ((strLine = in.readLine()) != null) {
Pattern pattern = Pattern.compile(regExp);
Matcher matcher = pattern.matcher(strLine);
listTemp = new ArrayList<String>();
while (matcher.find()) {
str = matcher.group();
str = str.trim();
if (str.endsWith(spaceMark)) {
str = str.substring(, str.length() - );
str = str.trim();
}
if (str.startsWith("\"") && str.endsWith("\"")) {
str = str.substring(, str.length() - );
if (CsvReader.isExisted("\"\"", str)) {
str = str.replaceAll("\"\"", "\"");
}
}
if (!"".equals(str)) {
listTemp.add(str);
}else{
listTemp.add(" ");
}
}
retval.add(listTemp);
rowReader.getRows(SHEET_NUM, rowNum, listTemp);
rowNum++;
}
} finally {
if (in != null) {
in.close();
}
}
} /**
* Regular Expression for CSV parse
*
* @return
*/
private String getRegExp() {
final String SPECIAL_CHAR_A = "[^\",\\n  ]";
final String SPECIAL_CHAR_B = "[^\"" + spaceMark + "\\n]"; StringBuffer strRegExps = new StringBuffer();
strRegExps.append("\"((");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*[" + spaceMark + "\\n  ])*(");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*\"{2})*)*");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*\"[  ]*" + spaceMark + "[  ]*");
strRegExps.append("|");
strRegExps.append(SPECIAL_CHAR_B);
strRegExps.append("*[  ]*" + spaceMark + "[  ]*");
strRegExps.append("|\"((");
strRegExps.append(SPECIAL_CHAR_A);
strRegExps.append("*[" + spaceMark + "\\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();
} /**
* If argChar is exist in argStr
*
* @param argChar
* @param argStr
* @return
*/
private static boolean isExisted(String argChar, String argStr) { boolean blnReturnValue = false;
if ((argStr.indexOf(argChar) >= ) && (argStr.indexOf(argChar) <= argStr.length())) {
blnReturnValue = true;
}
return blnReturnValue;
} }