csv解析

Java 解析csv文件

 

 

下载源代码


〖 作者:徐飞 〗〖 大小:2K 〗〖 发布日期:2009-10-24 〗〖 浏览:0 〗
  1. package xufei;   
  2.   
  3. import java.io.BufferedReader;   
  4. import java.io.FileInputStream;   
  5. import java.io.IOException;   
  6. import java.io.InputStreamReader;   
  7. import java.util.ArrayList;   
  8. import java.util.List;   
  9. import java.util.regex.Matcher;   
  10. import java.util.regex.Pattern;   
  11.   
  12. /*  
  13.  * 文件规则  
  14.  * Microsoft的格式是最简单的。以逗号分隔的值要么是“纯粹的”(仅仅包含在括号之前),  
  15.  * 要么是在双引号之间(这时数据中的双引号以一对双引号表示)。  
  16.  * Ten Thousand,10000, 2710 ,,"10,000","It's ""10 Grand"", baby",10K  
  17.  * 这一行包含七个字段(fields):  
  18.  *  Ten Thousand  
  19.  *  10000  
  20.  *   2710   
  21.  *  空字段  
  22.  *  10,000  
  23.  *  It's "10 Grand", baby  
  24.  *  10K  
  25.  * 每条记录占一行  
  26.  * 以逗号为分隔符  
  27.  * 逗号前后的空格会被忽略  
  28.  * 字段中包含有逗号,该字段必须用双引号括起来。如果是全角的没有问题。  
  29.  * 字段中包含有换行符,该字段必须用双引号括起来  
  30.  * 字段前后包含有空格,该字段必须用双引号括起来  
  31.  * 字段中的双引号用两个双引号表示  
  32.  * 字段中如果有双引号,该字段必须用双引号括起来  
  33.  * 第一条记录,可以是字段名  
  34.  */  
  35. /**   
  36.  * <p>タイトル: xufei.CSVAnalysis.java</p>  
  37.  * <p>説明: </p>  
  38.  * <p>著作権: Copyright (c) 2006</p>  
  39.  * <p>会社名: technodia</p>  
  40.  * @author  徐飞  
  41.  * @version 1.0  
  42.  * createDate Aug 11, 2008  
  43.  * 修正履歴  
  44.  * 修正日      修正者       修正理由  
  45.  */  
  46. public class CSVAnalysis {   
  47.     private InputStreamReader fr = null;   
  48.     private BufferedReader br = null;   
  49.   
  50.     public CSVAnalysis(String f) throws IOException {   
  51.         fr = new InputStreamReader(new FileInputStream(f));   
  52.     }   
  53.   
  54.     /**  
  55.      * 解析csv文件 到一个list中  
  56.      * 每个单元个为一个String类型记录,每一行为一个list。  
  57.      * 再将所有的行放到一个总list中  
  58.      * @return  
  59.      * @throws IOException  
  60.      */  
  61.     public List<List<String>> readCSVFile() throws IOException {   
  62.         br = new BufferedReader(fr);   
  63.         String rec = null;//一行   
  64.         String str;//一个单元格   
  65.         List<List<String>> listFile = new ArrayList<List<String>>();   
  66.         try {              
  67.             //读取一行   
  68.             while ((rec = br.readLine()) != null) {   
  69.                 Pattern pCells = Pattern   
  70.                         .compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");   
  71.                 Matcher mCells = pCells.matcher(rec);   
  72.                 List<String> cells = new ArrayList<String>();//每行记录一个list   
  73.                 //读取每个单元格   
  74.                 while (mCells.find()) {   
  75.                     str = mCells.group();   
  76.                     str = str.replaceAll(   
  77.                             "(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,""$1");   
  78.                     str = str.replaceAll("(?sm)(\"(\"))""$2");   
  79.                     cells.add(str);   
  80.                 }   
  81.                 listFile.add(cells);   
  82.             }              
  83.         } catch (Exception e) {   
  84.             e.printStackTrace();   
  85.         } finally {   
  86.             if (fr != null) {   
  87.                 fr.close();   
  88.             }   
  89.             if (br != null) {   
  90.                 br.close();   
  91.             }   
  92.         }   
  93.         return listFile;   
  94.     }   
  95.   
  96.     public static void main(String[] args) throws Throwable {   
  97.         CSVAnalysis parser = new CSVAnalysis("c:/test2.csv");   
  98.         parser.readCSVFile();   
  99.     }   
  100. }   
  101.   
  102.   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值