用Java解析CSV檔案

jieforest發表於2012-10-06
例子:

CODE:

package xufei;

import java.io.BufferedReader;
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;

/*
* 檔案規則
* Microsoft的格式是最簡單的。以逗號分隔的值要麼是“純粹的”(僅僅包含在括號之前),
* 要麼是在雙引號之間(這時資料中的雙引號以一對雙引號表示)。
* Ten Thousand,10000, 2710 ,,"10,000","It's ""10 Grand"", baby",10K
* 這一行包含七個欄位(fields):
*        Ten Thousand
*        10000
*         2710
*        空欄位
*        10,000
*        It's "10 Grand", baby
*        10K
* 每條記錄佔一行
* 以逗號為分隔符
* 逗號前後的空格會被忽略
* 欄位中包含有逗號,該欄位必須用雙引號括起來。如果是全形的沒有問題。
* 欄位中包含有換行符,該欄位必須用雙引號括起來
* 欄位前後包含有空格,該欄位必須用雙引號括起來
* 欄位中的雙引號用兩個雙引號表示
* 欄位中如果有雙引號,該欄位必須用雙引號括起來
* 第一條記錄,可以是欄位名
*/
/**

*

タイトル: xufei.CSVAnalysis.java


*

説明:


*

著作権: Copyright (c) 2006


*

會社名: technodia


* @author        徐飛
* @version 1.0
* createDate Aug 11, 2008
* 修正履歴
* 修正日      修正者       修正理由
*/
public class CSVAnalysis {
        private InputStreamReader fr = null;
        private BufferedReader br = null;

        public CSVAnalysis(String f) throws IOException {
                fr = new InputStreamReader(new FileInputStream(f));
        }

        /**
         * 解析csv檔案 到一個list中
         * 每個單元個為一個String型別記錄,每一行為一個list。
         * 再將所有的行放到一個總list中
         * @return
         * @throws IOException
         */
        public List> readCSVFile() throws IOException {
                br = new BufferedReader(fr);
                String rec = null;//一行
                String str;//一個單元格
                List> listFile = new ArrayList>();
                try {                       
                        //讀取一行
                        while ((rec = br.readLine()) != null) {
                                Pattern pCells = Pattern
                                                .compile("(\"[^\"]*(\"{2})*[^\"]*\")*[^,]*,");
                                Matcher mCells = pCells.matcher(rec);
                                List cells = new ArrayList();//每行記錄一個list
                                //讀取每個單元格
                                while (mCells.find()) {
                                        str = mCells.group();
                                        str = str.replaceAll(
                                                        "(?sm)\"?([^\"]*(\"{2})*[^\"]*)\"?.*,", "$1");
                                        str = str.replaceAll("(?sm)(\"(\"))", "$2");
                                        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 static void main(String[] args) throws Throwable {
                CSVAnalysis parser = new CSVAnalysis("c:/test2.csv");
                parser.readCSVFile();
        }
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/301743/viewspace-745800/,如需轉載,請註明出處,否則將追究法律責任。

相關文章