分享整理好的java csv解析类

 

文件常量类,文件类型相关的常量

package com.lijinquan.fileparse;

/**
 * 文件常量
 * 
 * @author lijinquan
 *
 */
public interface IFileBasic
{
	public static final String File_Type_CSV = "csv";
	
	public static final String File_Type_XLS = "xls";
	
	public static final String File_Type_XLSX="xlsx";
}

解析操作类

package common.lijinquan.utility;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.lijinquan.fileparse.IFileBasic;

/**
 * 
 * CSV文件解析操作类
 * 
 * @author lijinquan
 *
 */
public class CSVAnalysis
{
	private InputStreamReader fr = null;   
	
    private BufferedReader br = null;  
    
    private String fistSheetName = null;
  
	public CSVAnalysis(String f) throws IOException {   
        fr = new InputStreamReader(new FileInputStream(f));   
    	File file = new File(f);
    	setFistSheetName(file.getName().toLowerCase().replace("."+IFileBasic.File_Type_CSV, ""));
    }   
    
    public CSVAnalysis(File objfile) throws IOException 
    {   
        fr = new InputStreamReader(new FileInputStream(objfile));   
    	setFistSheetName(objfile.getName().toLowerCase().replace("."+IFileBasic.File_Type_CSV, ""));
    }   
    
    public CSVAnalysis(File objfile,String encode) throws IOException 
    {   
        fr = new InputStreamReader(new FileInputStream(objfile),encode);   
    	setFistSheetName(objfile.getName().toLowerCase().replace("."+IFileBasic.File_Type_CSV, ""));
    }   
  
    /**  
     * 解析csv文件 到一个list中  
     * 每个单元个为一个String类型记录,每一行为一个list。  
     * 再将所有的行放到一个总list中  
     * @return  
     * @throws IOException  
     */  
    public List<List<String>> readCSVFile() throws IOException {   
        br = new BufferedReader(fr);   
        String rec = null;//一行   
        String str;//一个单元格   
        List<List<String>> listFile = new ArrayList<List<String>>();   
        try {              
            //读取一行   
            while ((rec = br.readLine()) != null) {   
            	//补加逗号,用于解决xls文件变为csv文件的解析
            	if(!rec.endsWith(","))
            	{
            		rec = rec + ",";
            	}
                Pattern pCells = Pattern.compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");   
                Matcher mCells = pCells.matcher(rec);   
                List<String> cells = new ArrayList<String>();//每行记录一个list   
                //读取每个单元格   
                while (mCells.find()) {   
                    str = mCells.group();
                    //csv文件逗号分割符处理
                	if(str.endsWith(","))
                	{
                  		int iend = str.lastIndexOf(",");
                  		str = str.substring(0, iend);
                	}
                	//正则表达式处理
                    str = str.replaceAll("(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1"); 
                    str = str.replaceAll("(?sm)(\"(\"))", "$2");   
                    //csv文件双引号处理
                    str = str.replaceAll("\"\"", "\""); 
                    str = str.replaceAll("\" \"", "\""); 
                    cells.add(str);   
                }   
                listFile.add(cells);   
            }              
        } catch (Exception e) {   
            e.printStackTrace();   
        } finally {   
            if (fr != null) {   
                fr.close();   
            }   
            if (br != null) {   
                br.close();   
            }   
        }   
        return listFile;   
    }   

    public String getFistSheetName() {
		return fistSheetName;
	}

	public void setFistSheetName(String fistSheetName) {
		this.fistSheetName = fistSheetName;
	}

    public static void main(String[] args) throws IOException
    {   
        CSVAnalysis parser = new CSVAnalysis("C:/0000000000000.csv");   
        List<List<String>> result = parser.readCSVFile();
        if(result != null)
        {
        	for(int i = 0 ; i < result.size(); i++)
        	{
        		List<String> list1  = result.get(i);
        		System.out.print(i+":  ");
        		for(String cell : list1)
        		{
        			System.out.print(" |"+cell+"|  ");
        		}
        		System.out.println("  *");
        	}
        }
        
    }   

}

 

创建一个接口,后面csv文件操作类继承此类

package com.globex.supplier.logic.fileparse;

import java.util.List;
import java.util.Map;


/**
 * 文件操作接口
 * 
 * @author lijinquan
 *
 */
public interface IFileOperation
{
	/**
	 * 获取文件列头
	 * 
	 * @return 文件列头
	 */
	public String[] getColumnHeaders();
	
	/**
	 * 获取文件内容数据
	 * 
	 * @return 文件内容数据
	 */
	public List<String[]> getFileContentData();
	
	/**
	 * 获取用map形式组装的数据列表
	 * @author lijinquan
	 * @since 2017年12月15日
	 * @return
	 */
	public List<Map<String,String>> getFileContentDataMap();
	
	/**
	 * 获取文件所有数据
	 * 
	 * @return 文件所有数据
	 */
	public List<String[]> getFileData();
	
	/**
	 * 获取文件的第一个sheet名字
	 * @return
	 */
	public String getFirstSheetName();
}

 

csv文件操作类实现类

package com.lijinquan.fileparse;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import common.lijinuqan.CSVAnalysis;

/**
 * CSV文件操作类
 * 
 * @author lijinquan
 *
 */
public class CSVFileOperation implements IFileOperation
{
	/**
	 * CSV文件里的标题
	 */
	private String[] columnHeaders;

	/**
	 * CSV文件内容
	 */
	private List<String[]>  fileContentData;
	
	/**
	 * CSV文件里所有数据
	 */
	private List<String[]> fileData;

	/**
	 * 第一个sheet名字
	 */
	private String fistSheetName;
	
	public CSVFileOperation(String uploadfile) throws FileOperationException 
	{
		try
		{
			CSVAnalysis objCSVAnalys = new CSVAnalysis(uploadfile);
			init(objCSVAnalys);
		} catch (IOException e)
		{
			throw new FileOperationException(e);
		}
	}
	
	public CSVFileOperation(File objfile) throws FileOperationException 
	{
		try
		{
			CSVAnalysis objCSVAnalys = new CSVAnalysis(objfile);
			init(objCSVAnalys);
		} catch (IOException e)
		{
			throw new FileOperationException(e);
		}
	}
	
	
	/**
	 * 对CSV文件进行解析
	 * 
	 * @param objCSVAnalysis
	 * @throws FileOperationException 
	 */
	public void init(CSVAnalysis objCSVAnalysis) throws FileOperationException
	{
		try
		{
		    List<List<String>> result = objCSVAnalysis.readCSVFile();
		    
		    if(result != null && result.size() > 0)
	        {
		    	fileData = new ArrayList<String[]>(); 
	        	for(int i = 0 ; i < result.size(); i++)
	        	{
	        		List<String> list  = result.get(i);
	        		String[] arrtemp = new String[list.size()];
	        		arrtemp = list.toArray(arrtemp);
	        		fileData.add(arrtemp);
	        	}
				columnHeaders = fileData.get(0);
				fileContentData = new ArrayList<String[]>();
				fileContentData.addAll(fileData);
				fileContentData.remove(0);
	        }
		    setFistSheetName(objCSVAnalysis.getFistSheetName());
		} catch (IOException e)
		{
			throw new FileOperationException(e);
		}
	}

	public String[] getColumnHeaders()
	{
		return columnHeaders;
	}

	public List<String[]> getFileContentData()
	{
		return fileContentData;
	}

	public List<String[]> getFileData()
	{
		return fileData;
	}


	public String getFirstSheetName() {
		return fistSheetName;
	}

	public void setFistSheetName(String fistSheetName) {
		this.fistSheetName = fistSheetName;
	}

	@Override
	public List<Map<String, String>> getFileContentDataMap() {
		return null;
	}

}

 

定义一个工厂类,方便处理不同文件类型

 

package com.lijinquan.fileparse;
 
import java.io.File;
 
/**
 * excel文件解析工厂类
 * 
 * @author lijinquan
 *
 */
public class FileParseFatory
{
	/**
	 * 获得订单文件操作对象
	 * 
	 * @param fileType 文件类型
	 * @param uploadFile 文件路径,用于建立文件对象
	 * @return 文件操作对象
	 * @throws FileOperationException 
	 */
	public static IFileOperation getFileOperation(String fileType, String uploadFile) throws FileOperationException
	{
		if(IFileBasic.File_Type_CSV.equalsIgnoreCase(fileType))
		{
			return new CSVFileOperation(uploadFile);
			
		}else if(IFileBasic.File_Type_XLS.equalsIgnoreCase(fileType))
		{
			return new ExcelFileOperation(uploadFile);
		}else if(IFileBasic.File_Type_XLSX.equalsIgnoreCase(fileType))
		{
			return new XExcelFileOperation(uploadFile);
		}else
		{
			return null;
		}
			
	}
	
	/**
	 * 获得订单文件操作对象
	 * 
	 * @param fileType 文件类型
	 * @param upFile 文件对象
	 * @return 文件操作对象
	 * @throws FileOperationException 
	 */
	public static IFileOperation getFileOperation(String fileType, File upFile) throws FileOperationException{
		return getFileOperation(fileType,upFile,false);
	}
		
	public static IFileOperation getFileOperation(String fileType, File upFile,boolean assemMap) throws FileOperationException
	{
		if(IFileBasic.File_Type_CSV.equalsIgnoreCase(fileType))
		{
			return new CSVFileOperation(upFile);
			
		}else if(IFileBasic.File_Type_XLS.equalsIgnoreCase(fileType))
		{
			return new ExcelFileOperation(upFile,assemMap);
		}else if(IFileBasic.File_Type_XLSX.equalsIgnoreCase(fileType))
		{
			return new XExcelFileOperation(upFile);
		}
		else
		{
			return null;
		}
			
	}
}

 

到这里,只需要以下步骤进行调用即可

public static void main(String[] args) {
 
   File file= new File("E://abc/def.csv");
    String strFileType=	"csv";
	IFileOperation objFileOperation = FileParseFatory.getFileOperation(strFileType, file);
 
 
//获取表头
String[] columnHeaders = objFileOperation.getColumnHeaders();
 
//获取行内容
List<String[]> roLineContentData = objFileOperation.getFileContentData();
	}

 

相关链接  详细整理java jxl包读取excel文件点击这里

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值