csv解析和读取

一. csv文件解析:

        1.supersuv解析和写入:

            maven地址:

        <dependency>
		    <groupId>net.sourceforge.supercsv</groupId>
		    <artifactId>supercsv</artifactId>
		    <version>1.52</version>
		</dependency>

            工具类:(解析csv文件封装成List<List<String>>)

	 /** 
     * 解析csv文件 到一个list中 每个单元个为一个String类型记录,每一行为一个list。 再将所有的行放到一个总list中 (包含头信息和数据信息)
     */  
    public static List<List<String>> readCSVFile(String filePaths) throws IOException {
    	InputStreamReader isr = new InputStreamReader(new FileInputStream(filePaths),"GBK");
    	BufferedReader br = new BufferedReader(isr);
        List<List<String>> listFile = new ArrayList<List<String>>();
        try {
        	CsvListReader reader = new CsvListReader(isr, CsvPreference.EXCEL_PREFERENCE);
        	//获取头信息
        	String[] split = Arrays.asList(reader.getCSVHeader(true)).get(0).split("\\s+");
        	List<String> list = Arrays.asList(split);
        	List<String> headerList=new ArrayList<String>();
        	for (String string : list) {
        		if(string.contains("?")) {
        			headerList.add(string.substring(0,string.length()-1));
        		}else {
        			headerList.add(string);
        		}
			}
        	listFile.add(headerList);
        	
        	//获取数据(非第一行数据)
        	List<String> read=new ArrayList<String>();
        	while((read=reader.read())!=null) {
        		//行数据
            	List<String> line=new ArrayList<String>();
    			String[] lineSplit = read.get(0).split("\\s+");
    			List<String> li = Arrays.asList(lineSplit);
    			for (String string : li) {
    				if(string.contains("?")) {
    					line.add(string.substring(0,string.length()-1));
    				}else {
    					line.add(string);
    				}
    			}
    			listFile.add(line);
        	}
        } catch (Exception e) {
            e.printStackTrace();
        } finally {  
            if (isr != null) {  
                isr.close();  
            }
            if (br != null) {  
                br.close();  
            }
        }
        return listFile;
    } 

            

            其中,若未知csv文件中字段个数或者字段个数太多,可考虑上面这种方式,使用CsvListReader来封装整个流对象,进而解析csv文件。

            如果csv文件中字段已知而且个数也不是很多,可采用对象封装的方式,使用CsvBeanReader来封装整个流对象到指定的对象中。

            当然也可以封装到map中,使用CsvMapReader来封装整个流对象到map中,可直接在map中获取。当然除了读取csv文件外,还有写入到csv文件,对应的CsvListWriter,CsvBeanWriter,CsvMapWriter,同上面。

        2. javacsv解析csv文件和写入:

            maven地址:

<dependency>
    <groupId>net.sourceforge.javacsv</groupId>
    <artifactId>javacsv</artifactId>
    <version>2.1</version>
</dependency>

            API 说明文档:http://javacsv.sourceforge.net/           

            读取csv文件的工具类:

    public static void read(){

        String filePath = "XXX.csv";

        try {
            // 创建CSV读对象
            CsvReader csvReader = new CsvReader(filePath);

            // 读表头
            csvReader.readHeaders();
            while (csvReader.readRecord()){
                // 读一整行
                System.out.println(csvReader.getRawRecord());
                // 读这行的某一列
                System.out.println(csvReader.get("Link"));
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

            写入csv文件的工具类:

     public static void write(){

        String filePath = "/Users/dddd/test.csv";

        try {
            // 创建CSV写对象
            CsvWriter csvWriter = new CsvWriter(filePath,',', Charset.forName("GBK"));
            //CsvWriter csvWriter = new CsvWriter(filePath);

            // 写表头
            String[] headers = {"编号","姓名","年龄"};
            String[] content = {"12365","张山","34"};
            csvWriter.writeRecord(headers);
            csvWriter.writeRecord(content);
            csvWriter.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 

        3.jdk自带的解析csv(通过流和正则表达式来解析csv):

            读取csv文件:

	/** 
     * 解析csv文件 到一个list中 每个单元个为一个String类型记录,每一行为一个list。 再将所有的行放到一个总list中(包含头信息和数据信息) 
     */  
    public static List<List<String>> readCSVFile(String filePaths) throws IOException {  
    	InputStreamReader fr=new InputStreamReader(new FileInputStream(filePaths),"GBK");
    	BufferedReader br = new BufferedReader(fr);  
        String rec = null;// 一行  
        String str;// 一个单元格  
        List<List<String>> listFile = new ArrayList<List<String>>();  
        try {  
            // 读取一行  
            while ((rec = br.readLine()) != null) {  
                int index=0;  
                Pattern pCells = Pattern  
                        .compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");  
                Matcher mCells = pCells.matcher(rec);  
                List<String> cells = new ArrayList<String>();// 每行记录一个list  
                // 读取每个单元格  
                while (mCells.find()) {  
                    str = mCells.group();  
                    str = str.replaceAll(  
                            "(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");  
                    str = str.replaceAll("(?sm)(\"(\"))", "$2");  
                    cells.add(str);  
                    index = mCells.end();  
                }  
                cells.add(rec.substring(index));  
                listFile.add(cells);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (fr != null) {  
                fr.close();  
            }  
            if (br != null) {  
                br.close();  
            }  
        }  
        return listFile;  
    }

可针对csv文件中的特殊字符,包括&,%,-,\,/等

 

可根据自己喜好选择解析csv文件的工具类。

 

CSV文件格式(Comma Separate Values):

每条记录占一行

以逗号为分隔符

逗号前后的分隔符会被忽略

字段中如果含有逗号,需要双引号括起来

字段中含有换行符,需要双引号括起来

字段中含有空格,需要双引号括起来

字段中含有双引号,需要双引号括起来

字段中的双引号用两个双引号表示

第一条记录可以是字段名

解析csv文件正则:(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,

转载于:https://my.oschina.net/u/3110937/blog/1585646

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值