Csv
CsvConfigやCsvHandlerを使用して指定されたCSVファイルやストリームへアクセスするCsv統合アクセスユーティリティです。ファイルやストリーム、文字ストリーム(Reader/Writer)の他に、ZIPやLHAといった圧縮形式のファイルやストリームもサポートされています。
// ZIPファイルから読み込み
ZipFile zipFile = new ZipFile(new File("example.zip"));
try {
List<String[]> list = Csv.load(zipFile, cfg, handler);
} finally {
zipFile.close();
}
// ZIPファイルへ書き込み
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File("example.zip")));
try {
// example.csvというエントリ名でZIP圧縮形式へ出力します。
Csv.save(list, zos, cfg, handler, "example.csv");
} finally {
zos.close();
}
特定のZIPエントリのみを対象とする場合はエントリフィルタを使用します。
ZipFile zipFile = new ZipFile(new File("example.zip"));
try {
// この例では、エントリ名が".csv"で終わるエントリのみを対象とします。
List<String[]> list = Csv.load(zipFile, cfg, handler, new SuffixEntryNameFilter(".csv"));
} finally {
zipFile.close();
}
CsvManager
CsvManagerはPOJOオブジェクトでのCSVアクセスを簡単にするため、Csvユーティリティをより発展させたCSV統合アクセスインターフェースです。CsvManagerはCsvHandlerを内包しており、使用したいマッピング方式によって必要なCsvManagerの実装を使います。
| CsvManager | 内包するCsvHandler |
|---|---|
| CsvBeanManager | BeanListHandler |
| CsvColumnNameMappingBeanManager | ColumnNameMappingBeanListHandler |
| CsvColumnPositionMappingBeanManager | ColumnPositionMappingBeanListHandler |
| CsvEntityManager | CsvEntityListHandler |
CsvFilter
CsvFilterは、ある条件と一致するCSVデータやPOJOオブジェクトだけを読み込みまたは書き込むためのデータフィルタです。データフィルタはCSVの行データを対象とするものとPOJOオブジェクトを対象にするものの2系統があり、CsvHandlerやCsvManagerで使用します。
| データフィルタ | 対象 |
|---|---|
| CsvValueFilter | CSV行データ |
| CsvNamedValueFilter | CSV行データ |
| BeanFilter | POJOオブジェクト |
CsvValueFilter
CsvValueFilterは、CSVの項目位置で条件を指定するデータフィルタです。CSVの生値である文字列で比較するため高速ですが、書式化された文字列の比較には不向きです。
// CsvHandlerでデータフィルタを使用する例
new StringArrayListHandler()
.filter(new SimpleCsvValueFilter()
.in(0, "佐藤", "鈴木")
.eq(2, "東京都")
);
// CsvManagerでデータフィルタを使用する例
new CsvColumnPositionMappingBeanManager()
.load(Customer.class);
.filter(new SimpleCsvValueFilter()
.in(0, "佐藤", "鈴木")
.eq(2, "東京都")
)
.offset(0)
.limit(1000)
.from(reader);
CsvNamedValueFilter
CsvNamedValueFilterは、CSVの項目位置または項目名で条件を指定するデータフィルタです。CSVの生値である文字列で比較するため高速ですが、書式化された文字列の比較には不向きです。
// CsvHandlerでデータフィルタを使用する例
new ColumnNameMapListHandler()
.filter(new SimpleCsvNamedValueFilter()
.in("姓", "佐藤", "鈴木")
.eq("都道府県", "東京都")
);
// CsvManagerでデータフィルタを使用する例
new CsvColumnNameMappingBeanManager()
.load(Customer.class);
.filter(new SimpleCsvNamedValueFilter()
.in("姓", "佐藤", "鈴木")
.eq("都道府県", "東京都")
)
.offset(0)
.limit(1000)
.from(reader);
BeanFilter
BeanFilterは、POJOオブジェクトのフィールド名で条件を指定するデータフィルタです。POJOオブジェクトのフィールド値で比較するので柔軟性がありますが、他2つのデータフィルタほど高速ではありません。
// CsvHandlerでデータフィルタを使用する例
new CsvEntityListHandler<Customer>(Customer.class)
.filter(new SimpleBeanFilter()
.in("name", "佐藤", "鈴木")
.eq("prefecture", "東京都")
.between("age", 20, 60)
);
// CsvManagerでデータフィルタを使用する例
new CsvEntityManager()
.load(Customer.class);
.filter(new SimpleBeanFilter()
.in("name", "佐藤", "鈴木")
.eq("prefecture", "東京都")
.between("age", 20, 60)
)
.offset(0)
.limit(1000)
.from(reader);
まとめ
今回紹介した機能以外にもCsvReaderやCsvWriterなどのローレベルアクセス機能もありますが、本記事では概要編ということで割愛させていただき、公式サイトの説明をなぞる形式で全体をざっくりと説明しました。
OrangeSignal CSVは「シンプルで機能的」なCSVライブラリということがおわかりいただけたでしょうか。ぜひお試しください。
