Opencsv
提供:Asterisk Works Wiki
JavaでCSVを読み込むときに便利なライブラリー
CSV形式のデータを読み込んでBeanに格納したりしてくれるので便利。
Webサイト:opencsv - Frequently Asked Questions
目次 |
基本的な使い方
郵便番号データを読み込み標準出力に表示する例
package jp.asterisk_works.opencsv.postalcode;
import java.io.*;
import au.com.bytecode.opencsv.CSVReader;
/**
* 郵便番号データCSVを読み込むクラス。
*
* @since 2011/04/24
* @author Net Aqua Project all rights reserved.
*/
public class PostalCodeReader {
private static final String CHAR_SET = "Shift_JIS";
public void read(String filename) throws IOException{
InputStreamReader input = new InputStreamReader(new FileInputStream(filename), CHAR_SET);
CSVReader reader = new CSVReader(input);
String[] nextLine;
while ((nextLine = reader.readNext()) != null ){
System.out.format("%s %s %s %s\n", nextLine[2], nextLine[6], nextLine[7], nextLine[8]);
}
}
}
csvデータをJavaBeanに格納して取り出す
次の例は読み込んだデータをBeanのリストとして取り出すメソッドの例。
郵便番号データのようにフォーマット(各カラムの順番)が固定でヘッダーがない場合はColumnPositionMappingStrategyを使って何番目のカラムがJavaBeanのどのフィールドに対応するかを指定する。
途中のカラムで読み取りたくないカラムがあればBeanのフィールドにない適当な文字列をそのカラムの順番の場所に指定しておけば良い。
下の例の場合は2番目のカラムは不要なので"1"としている。"1"というフィールドはBeanにはない。
末尾のフィールドを読みたくなければ、定義しなければ良い。
郵便番号データの場合、15カラムあるが、下の例では10カラム目以降は読んでいない。
public List<PostalCode> toBean(String filename) throws UnsupportedEncodingException, FileNotFoundException{
InputStreamReader input = new InputStreamReader(new FileInputStream(filename), CHAR_SET);
CsvToBean<PostalCode> ctb = new CsvToBean<PostalCode>();
ColumnPositionMappingStrategy<PostalCode> strategy = new ColumnPositionMappingStrategy<PostalCode>();
String[] colums = {"code","1","postalCode","prefNameKana","cityNameKana","townNameKana","prefName","cityName","townName"};
strategy.setColumnMapping(colums);
strategy.setType(PostalCode.class);
List<PostalCode> postalCodes = ctb.parse(strategy, input);
return postalCodes;
}
ちなみにPostalCodeクラスはこんなの。
public class PostalCode {
private String code;
private String postalCode;
private String prefName;
private String cityName;
private String townName;
private String prefNameKana;
private String cityNameKana;
private String townNameKana;
//getter setterは省略
}
可変なCSVファイルの場合
読み込めるカラムの最大は決まっているが、その時々で必要なカラムのみ読みたいとか、カラムの順序も可変でヘッダーの指定通りに読みたい場合にはHeaderColumnNameTranslateMappingStrategyを使う。
読み込み文字コードの指定
読み込み時に使うInputStreamReaderで指定する。