posts - 431,  comments - 344,  trackbacks - 0

Super CSV是一个用于处理CSV文件的Java开源项目。它完全围绕面向对象的思想进行设计,因此可以利用你的面向对象代码来使得处理CSV文件变得更加简易。它支持输入/输出类型转换、数据完整性校验,支持从任何地方以任何编码读写数据,只要提供相应的Reader与Writer对象。可配置分割符,空格符号和行结束符等。
下面来看一下官方文档中的代码示例。
1. 根据头来读取CSV文件
    把文件中的每行记录读取出来转化为java对象,假设你有一个UserBean类,代码如下:
        public class UserBean {
            
String username, password, street, town;
            
int zip;

            
public String getPassword() { return password; }
            
public String getStreet() { return street; }
            
public String getTown() { return town; }
            
public String getUsername() { return username; }
            
public int getZip() { return zip; }
        
    public void setPassword(String password) { this.password = password; }
            
public void setStreet(String street) { this.street = street; }
        
    public void setTown(String town) { this.town = town; }
            
public void setUsername(String username) { this.username = username; }
    
        public void setZip(int zip) { this.zip = zip; }
        }

 并且有一个CSV文件,包含一个文件头,假设文件内容如下:
    username, password,   date,        zip,  town
    Klaus,    qwexyKiks,  17/1/2007,   1111, New York
    Oufu,     bobilop,    10/10/2007,  4555, New York

然后你可以使用一下代码来创建UserBean的实例对象,并打印出对象的属性值:
    class ReadingObjects {
        public static void main(String[] args) throws Exception{
            ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
            
try {
                final String[] header = inFile.getCSVHeader(true);
                UserBean user;
                while( (user = inFile.read(UserBean.class, header, processors)) != null) {
                    
System.out.println(user.getZip());
                }
            } finally {
                inFile
.close();
            }
        }
    }
我们还剩下processors没有定义,通过名字我们可以看出是解析器,用来处理每列的数据,当然你也可以传入null,表示该列不做特殊处理,每个解析器可以被另外一个包含在内部,new Unique(new StrMinMax(5,20)),这个代码该列的值为唯一的,并且长度为8到20,具体处理细节我们先不讲,来看一下我们所需要的processors是如何定义的:
    final CellProcessor[] processors = new CellProcessor[] {
        
new Unique(new StrMinMax(5, 20)),
        
new StrMinMax(8, 35),
        
new ParseDate("dd/MM/yyyy"),
    
    new Optional(new ParseInt()),
    
    null
    };

上面的代码的具体意思为:
第一列是一个字符串,并且值是唯一的,长度为5到20
第二列是一个字符串,长度是8到35
第三列为一个日期类型,格式为天/月/年(day/month/year)
第四列是一个整型数字,但只有这列有值的时候ParseInt处理器才会去处理这个值(其实就是该列可以为空)
第五列为一个字符串(默认),不使用处理器

如果你的CSV文件没有头,你也可以定义个数组来替代:
final String[] header = new String[] { "username", "password", "date", "zip", "town"};
如果你想忽略某一列,和定义处理器类似,直接在头数组中使用null。

全部代码如下:
import Java.io.FileReader;
import Java.io.IOException;
import org.supercsv.cellprocessor.Optional;
import org.supercsv.cellprocessor.ParseDate;
import org.supercsv.cellprocessor.ParseInt;
import org.supercsv.cellprocessor.constraint.StrMinMax;
import org.supercsv.cellprocessor.constraint.Unique;
import org.supercsv.cellprocessor.ift.CellProcessor;
import org.supercsv.io.CsvBeanReader;
import org.supercsv.io.ICsvBeanReader;
import org.supercsv.prefs.CsvPreference;

class ReadingObjects {

   
static final CellProcessor[] userProcessors = new CellProcessor[] {
       
new Unique(new StrMinMax(5, 20)),
       
new StrMinMax(8, 35),
       
new ParseDate("dd/MM/yyyy"),
       
new Optional(new ParseInt()),
       
null
   
};

   
public static void main(String[] args) throws Exception {
       
ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
       
try {
         
final String[] header = inFile.getCSVHeader(true);
         
UserBean user;
         
while( (user = inFile.read(UserBean.class, header, userProcessors)) != null) {
           
System.out.println(user.getZip());
         
}
       
} finally {
          inFile
.close();
       
}
   
}
}



public class UserBean {
   
String username, password, town;
   
Date date;
   
int zip;

   
public Date getDate() {
       
return date;
   
}

   
public String getPassword() {
       
return password;
   
}

   
public String getTown() {
       
return town;
   
}

   
public String getUsername() {
       
return username;
   
}

   
public int getZip() {
       
return zip;
   
}

   
public void setDate(final Date date) {
       
this.date = date;
   
}

   
public void setPassword(final String password) {
       
this.password = password;
   
}

   
public void setTown(final String town) {
       
this.town = town;
   
}

   
public void setUsername(final String username) {
       
this.username = username;
   
}

   
public void setZip(final int zip) {
       
this.zip = zip;
   
}

}


如果你在读取文件之前根本不知道文件的具体格式,你可以选择CsvListReader.read()方法,把每行读出出来的数据放在一个List里面。

读取文件的代码我们看到了,下面来看一下写的操作,也很简单。
import Java.util.HashMap;
import org.supercsv.io.*;
import org.supercsv.prefs.CsvPreference;

class WritingMaps {
  main
(String[] args) throws Exception {
   
ICsvMapWriter writer = new CsvMapWriter(new FileWriter(...), CsvPreference.EXCEL_PREFERENCE);
   
try {
     
final String[] header = new String[] { "name", "city", "zip" };
     
// set up some data to write
     
final HashMap<String, ? super Object> data1 = new HashMap<String, Object>();
      data1
.put(header[0], "Karl");
      data1
.put(header[1], "Tent city");
      data1
.put(header[2], 5565);
     
final HashMap<String, ? super Object> data2 = new HashMap<String, Object>();
      data2
.put(header[0], "Banjo");
      data2
.put(header[1], "River side");
      data2
.put(header[2], 5551);
     
// the actual writing
      writer
.writeHeader(header);
      writer
.write(data1, header);
      writer
.write(data2, header);
   
} finally {
      writer
.close();
   
}
 
}
}

posted on 2009-09-20 17:48 周锐 阅读(1473) 评论(0)  编辑  收藏 所属分类: JavaXML

只有注册用户登录后才能发表评论。


网站导航: