CSV逗号分隔符文件解析

本文介绍了一个用Java编写的CSV文件解析器,该解析器能够读取CSV文件,并使用正则表达式来处理每一行的数据,支持包含逗号及双引号的数据项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CsvParser {
	// Saved input CSV file pathname
	private String inputCsvFile;
	
	// Space mark , ; : etc.
	private String spaceMark=",";
	
	private Object[] arr = null;
	/**
	 * Constructor
	 * @param inputCsvFile
	 * @param spaceMark
	 */
	public CsvParser(String inputCsvFile,String spaceMark){
		this.inputCsvFile=inputCsvFile;
		this.spaceMark=spaceMark;
	}
	
	/**
	 * Constructor
	 * @param inputCsvFile
	 */
	public CsvParser(String inputCsvFile){
		this.inputCsvFile=inputCsvFile;
		this.spaceMark=",";
	}
	
	/**
	 * Get parsed array from CSV file
	 * @return
	 */
	public Object[] getParsedArray() {
		List> retval=new ArrayList>();
		try {
			String regExp = getRegExp();
			BufferedReader in = new BufferedReader(new FileReader(this.inputCsvFile));
			String strLine;
			String str = "";
	
			while ((strLine = in.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(spaceMark))
					{
						str = str.substring(0, str.length() - 1);
						str = str.trim();
					}
					
					if (str.startsWith("\"") && str.endsWith("\""))
					{
						str = str.substring(1, str.length() - 1);
						if (isExisted("\"\"", str))
						{
							str = str.replaceAll("\"\"", "\"");
						}
					}
					
					if (!"".equals(str))
					{
						listTemp.add(str);
					}
				}
				// Add to retval
				retval.add(listTemp);
			}
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		arr = retval.toArray();
		return arr;
	}
	
	public void printArr() {
		if (arr != null) {
			for(Object obj : arr) {
				List list = (List) obj;
				StringBuffer sb = new StringBuffer();
				for(String item : list) {
				    sb.append(item + ",");
				}
				sb.setLength(sb.length() - 1);
				System.out.println("[" + sb + "]");
			}
		}
	}
	
	/**
	 * 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 boolean isExisted(String argChar, String argStr)
	{
		boolean blnReturnValue = false;
		if ((argStr.indexOf(argChar) >= 0)
				&& (argStr.indexOf(argChar) <= argStr.length()))
		{
			blnReturnValue = true;
		}
		return blnReturnValue;
	}
}


测试类

public class MainTest {
	public static void main(String[] args)
	{
		CsvParser csvParser = new CsvParser("D:\\test.csv");
		Object[] data = csvParser.getParsedArray();
		csvParser.printArr();
	}
}

data是一个String二维数组,对应csv文件中的每一个字段


代码参考:http://www.cnblogs.com/xiandedanteng/p/3470609.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值