`

Super CSV用于处理CSV文件的Java开源项目

阅读更多
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();
    }
  }
}
分享到:
评论
3 楼 yaov 2016-10-31  
mark
2 楼 攻城小狮 2016-10-25  
感谢 这个对CellProcessor的介绍很容易理解。
1 楼 flyli815 2011-08-17  
这个也不太行啊!不能输出1301699234566666的数字啊! 用Excel打开后会显示为:1.3E+15

相关推荐

Global site tag (gtag.js) - Google Analytics