CSVBeans:Java解析CSV

來源:互聯網
上載者:User

一、CSV和CSVBeans介紹
CSV:Comma Seperated Values;描述:一行代表一個記錄,並且一個記錄有多個域(屬性),每個屬性用逗號(或其他符號)分隔。

CSVBeans開源項目:將CSV的每行資料轉換成JavaBean的開源工具;

Download URL:http://sourceforge.net/projects/csvbeans/files/ 

當然解析csv不只有一個工具,還有apache的opencsv等;


依賴包在lib目錄中,也要一併添加,包括:commons-resources.jarcommons-logging.jarcommons-lang-2.1.jarcommons-digester-1.7.jarcommons-codec-1.3.jarcommons-beanutils-core.jarcommons-beanutils-bean-collections.jarcommons-beanutils.jar
二、項目缺陷解決
首先,這個項目我目前找出了兩個小問題:(1)csv檔案資料之間不能夠以\t分隔;(2)寫csv檔案時,一定要帶有startTag;

必須要有startTag的意思是:Persons   ---->這個就是startTagaaa,20aaa,20aaa,20
不能沒有startTag的意思是:aaa,20aaa,20aaa,20
如果startTag設為null,則會有問題;

解決:
(1)對於第一個問題,如果存在一個csv檔案以\t分隔,則我寫了一個輔助類,可以用於將此csv檔案重寫成以逗號分隔的csv檔案;

package com.xiazdong.csv;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.UUID;public class CSVUtils {/** * 此函數用於輔助CSVBeans,由於此開源包有一個缺陷,就是不能解析以tab為分隔字元的csv,因此此函數專門用於將tab轉換成逗號,並覆蓋原有檔案 * @param fromFile需要轉換的檔案 * @throws Exception */public static void parseFromTabToComma(File fromFile)throws Exception{BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fromFile)));File tmpFile = new File(UUID.randomUUID().toString());//產生臨時檔案,不過最後不會存在PrintWriter writer = new PrintWriter(tmpFile);String line = null;while((line=reader.readLine())!=null){String ss[] = line.split("\\t");//以tab分隔for(int i=0;i<ss.length;i++){writer.write(ss[i]);if(i<(ss.length-1)){writer.write(",");}}writer.write("\n");}writer.close();reader.close();if(fromFile.exists()){fromFile.delete();tmpFile.renameTo(fromFile);}}public static void main(String[] args) throws Exception {parseFromTabToComma(new File("src/persons.csv"));}}

(2)對於第二個問題,就必須要修改源碼了;
源碼下載:http://sourceforge.net/projects/csvbeans/files/csvbeans/csvbeans-0.7.1/
csvbeans-0.7.1\src\java\org\csvbeans\builders\CSVBuilder.java addBeans函數改為:public void addBeans(String tag, List beans) {       
if (beans != null) {            this.beans.add(new Records(tag, beans));        }}
writeBeans函數開頭改為:try {        if(tag!=null)        writer.writeLine(tag);RecordSpecification record = getRecordSpecification(tag);
修改了源碼後還需要用ant編譯,ant package 就自動產生了csvbeans.jar;

三、前期準備

1.編寫JavaBean表示一條CSV記錄;
2.編寫一個XML檔案,內容為:(1)一條CSV記錄的屬性,每個屬性的name、maxLen等;(2)每個屬性之間的分隔字元;(3)JavaBean所在類;(4)使用的Parser類、Builder類;

四、編寫程式

目錄結構:


首先說明,讀取csv和寫入csv的JavaBean和mapping.xml都是一樣的;
1.讀取csv

Person.java略
mapping.xml
<?xml version="1.0" ?><csvbeans><strategy><parser className="org.csvbeans.parsers.CSVParser" /><builder className="org.csvbeans.builders.CSVBuilder" /></strategy><property name="separator" value="," /> <!--分隔字元 --><property name="noStartTag" value="true" /> <!--沒有startTag --><record className="com.xiazdong.csv.domain.Person">  <!-- 一條記錄-->  <field name="name" maxLen="100" required="true" /> <field name="age" maxLen="10" required="true"/></record></csvbeans>

讀取csv程式:

private static void read() throws Exception, SpecificationsFileException,FileNotFoundException, ParsingException {File f = new File("src/persons.csv");CSVUtils.parseFromTabToComma(f);  //如果csv檔案是以tab分隔,則需要使用這個函數SpecificationsFileParser specsParser = new SpecificationsFileParser();SpecificationsFile  specs = specsParser.parse(new FileInputStream("src/mapping.xml"));ParsingStrategy parser = specs.getParsingStrategy();   //獲得mapping.xml中的CSVParserparser.parse(new InputStreamLinesReader(new FileInputStream(f)));List products = parser.getBeans(null);//沒有頭for (Iterator it = products.iterator(); it.hasNext(); ) {  Person product = (Person) it.next();  System.out.println(product);                }}
2.寫入csv

private static void write() throws SpecificationsFileException,FileNotFoundException, GenerationException {List<Person> persons = new ArrayList<Person>();persons.add(new Person("我", 20, 20));persons.add(new Person("aaa", 20, 20));persons.add(new Person("aaa", 20, 20));SpecificationsFileParser specsParser = new SpecificationsFileParser();SpecificationsFile  specs = specsParser.parse(new FileInputStream("src/mapping.xml"));BuildingStrategy builder = specs.getBuildingStrategy();  //獲得mapping.xml中的CSVBuilderCSVBuilder csvbuilder = (CSVBuilder)builder;csvbuilder.addBeans(null, persons);csvbuilder.build(new OutputStreamLinesWriter(new FileOutputStream("src/output.csv")));}




相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.