OrangeSignal CSVの導入
ここでは、執筆時点での最新版であるバージョン1.2.3を例に取り解説していきます。
- OrangeSignal ダウンロードサイトからOrangeSignal CSVのバイナリパッケージをダウンロードします。
- ダウンロードしたZIP形式のバイナリパッケージを解凍して、orangesignal-csv-1.2.3.jarファイルとjlha-0.06-05.jarファイルへクラスパスを通せば準備完了です。
orangesignal-csv-1.2.3.jarファイル、jlha-0.06-05.jarファイルの代わりに、これらのファイルを一体化したorangesignal-csv-1.2.3-with-jlha.jarファイルへクラスパスを通してもOKです。
OrangeSignal CSVで簡単アクセス
OrangeSignal CSVでCSVへアクセスするには、Csvユーティリティを使用する方法と、CsvManagerを使用する2種類の方法があります。
Csvユーティリティは、CSVへの統合アクセス機能を提供するユーティリティです。CSVの読み込みはload
メソッド、書き込みはsave
メソッドがそれぞれ提供されており、「CSV形式」「オブジェクトへのマッピング方法」「CSVファイルやストリームなどのCSVデータ」を指定することでアクセスを行います。
// 読み込み List<String[]> list = Csv.load(new File("codezine.csv"), new CsvConfig(), new StringArrayListHandler()); // 書き込み Csv.save(list, new File("codezine.csv"), new CsvConfig(), new StringArrayListHandler());
この例では「codezine.csv」というファイル名で、デフォルトのCSV形式で読み書きを行っています。また、オブジェクトのマッピング方法として、文字列配列のリストでマッピングするStringArrayListHandlerを使用しています。
次に、CsvManagerを使用したPOJOオブジェクトでのCSVアクセスを紹介します。
CsvManagerはPOJOオブジェクトでのCSVアクセスを容易にするための統合アクセスインターフェースです。POJOオブジェクトでのCSVアクセスは、Csvユーティリティを使用するよりCsvManagerを使用した方が可読性もよく、簡単に行うことができます。
// 読み込み List<Customer> customers = new CsvManagerFactory.newCsvManager() .load(Customer.class); .from(new File("customers.csv")); // 書き込み CsvManagerFactory.newCsvManager() .save(customers, Customer.class) .to(new File("customers.csv"));
OrangeSignal CSVの構成
ここでは、Csv統合アクセスユーティリティやCsvManager統合アクセスインターフェースを使用するうえで必要不可欠な、CSV形式情報(CsvConfig)やデータアクセスハンドラ(CsvHandler)などについて説明していきます。
CsvConfig
CsvConfigは、区切り文字や囲み文字などCSV形式(CSV方言)に関する設定情報を管理するクラスです。
// デフォルトでは区切り文字(,)のみが有効な状態で、囲み文字(")やエスケープ文字(\)は無効となっています。 CsvConfig cfg = new CsvConfig(); // 区切り文字と囲み文字、エスケープ文字を指定してCSV形式設定情報を構築した場合は、 // 自動的に無効化が解除され有効となります。 CsvConfig cfg = new CsvConfig(',', '"', '"'); // 区切り文字としてタブ文字(\t)を指定する例です。ただし、囲み文字(")やエスケープ文字(\)は無効となったままです。 CsvConfig cfg = new CsvConfig('\t');
CsvConfigでその他の高度な設定を行う場合は、CsvConfigをインスタンス化した後に設定を行います。
CsvConfig cfg = new CsvConfig(); cfg.setQuoteDisabled(false); // デフォルトでは無効となっている囲み文字を有効にします。 cfg.setEscapeDisabled(false); // デフォルトでは無効となっているエスケープ文字を有効にします。 cfg.setBreakString("\n"); // 項目値中の改行を\nで置換えます。 cfg.setNullString("NULL"); // null値扱いする文字列を指定します。 cfg.setIgnoreLeadingWhitespaces(true); // 項目値前のホワイトスペースを除去します。 cfg.setIgnoreTrailingWhitespaces(true); // 項目値後のホワイトスペースを除去します。 cfg.setIgnoreEmptyLines(true); // 空行を無視するようにします。 cfg.setIgnoreLinePatterns(Pattern.compile("^#.*$")); // 正規表現による無視する行パターンを設定します(この例では#で始まる行)。 cfg.setSkipLines(1); // 最初の1行目をスキップして読み込みます。 // Csv統合アクセスユーティリティでの使用例 List<String[]> list = Csv.load(new File("example.csv"), cfg, new StringArrayListHandler()); // CsvManager統合アクセスインターフェースでの使用例 List<Customer> customers = CsvManagerFactory.newCsvManager() .config(cfg) .load(Customer.class) .from(new File("customers.csv"));
CsvHandler
CsvHandlerはCSVデータへのアクセスとオブジェクト変換を実質的に管理するデータアクセスハンドラです。マッピングするオブジェクトの形式に合わせて各種ハンドラが提供されています。
CsvHandler | マッピング・オブジェクトの型 |
---|---|
StringArrayListHandler | List<String[]> |
ResultSetHandler | ResultSet |
ColumnNameMapListHandler | List<Map<String, String>> |
ColumnPositionMapListHandler | List<Map<Integer, String>> |
BeanListHandler | POJOオブジェクトのリスト |
ColumnNameMappingBeanListHandler | POJOオブジェクトのリスト |
ColumnPositionMappingBeanListHandler | POJOオブジェクトのリスト |
CsvEntityListHandler | CsvEntityアノテーション付きPOJOオブジェクトのリスト |
StringArrayListHandler
StringArrayListHandlerは、文字列配列のリストでCSVデータへのアクセスを可能とするハンドラです。
// 入力 List list = Csv.load(file, cfg, new StringArrayListHandler()); // 出力 Csv.save(list, file, cfg, new StringArrayListHandler());
ResultSetHandler
ResultSetHandlerは、データベースの結果セットでCSVデータへのアクセスを可能とするハンドラです。
// 入力 ResultSet rs = Csv.load(file, cfg, new ResultSetHandler()); // 出力 Csv.save(rs, file, cfg, new ResultSetHandler());
ColumnNameMapListHandler
ColumnNameMapListHandlerは、CSVヘッダ行の項目名とCSVデータの項目値とのマップオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。
// 入力 List<Map<String, String>> list = Csv.load(file, cfg, new ColumnNameMapListHandler()); // 出力 Csv.save(list, file, cfg, new ColumnNameMapListHandler());
ColumnPositionMapListHandler
ColumnPositionMapListHandlerは、CSVヘッダ行の項目位置とCSVデータの項目値とのマップオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。
// 入力 List<Map<Integer, String>> list = Csv.load(file, cfg, new ColumnPositionMapListHandler()); // 出力 Csv.save(list, file, cfg, new ColumnPositionMapListHandler());
BeanListHandler
BeanListHandlerは、POJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラはCSVヘッダ行の項目名とPOJOオブジェクトのフィールド名を対応付けて処理します。
// 入力 List customers = Csv.load(file, cfg, new BeanListHandler<Customer>(Customer.class)); // 出力 Csv.save(customers, file, cfg, new BeanListHandler<Customer>(Customer.class));
特定の項目のみを対象としたい場合や、特定の項目のみを非対象としたい場合は次の例のように指定することで可能となります。
// 特定の項目だけ対象とせずに入力(この例ではnameとfullnameを非対象) List<Customer> customers = Csv.load(file, cfg, new BeanListHandler<Customer>(Customer.class).excludes("name", "fullname")); // 特定の項目だけ対象として出力(この例ではageとsexのみ対象) Csv.save(customers, file, cfg, new BeanListHandler<Customer>(Customer.class).includes("age", "sex"));
ColumnNameMappingBeanListHandler
ColumnNameMappingBeanListHandlerは、BeanListHandlerと同じくPOJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラは、CSVヘッダ行の項目名とPOJOオブジェクトのフィールド名の対応付け情報をもとに処理します。
// 入力 List<Customer> customers = Csv.load(file, cfg, new ColumnNameMappingBeanListHandler<Customer>(Customer.class)); // 出力 Csv.save(customers, file, cfg, new ColumnNameMappingBeanListHandler<Customer>(Customer.class));
ColumnPositionMappingBeanListHandler
ColumnPositionMappingBeanListHandlerは、BeanListHandlerと同じくPOJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラは、CSVヘッダ行の項目位置とPOJOオブジェクトのフィールド名の対応付け情報をもとに処理します。
// 入力 List<Customer> customers = Csv.load(file, cfg, new ColumnPositionMappingBeanListHandler<Customer>(Customer.class)); // 出力 Csv.save(customers, file, cfg, new ColumnPositionMappingBeanListHandler<Customer>(Customer.class));
CsvEntityListHandler
CsvEntityListHandlerは、CSV用のアノテーションCsvEntity
で注釈付けされたPOJOオブジェクトのリストでCSVデータへのアクセスを可能とするハンドラです。このハンドラは、CSVヘッダ行の項目とPOJOオブジェクトのCsvColumn
アノテーションで指定された項目の対応付け情報をもとに処理します。
// 入力 List customers = Csv.load(file, cfg, new CsvEntityListHandler<Customer>(Customer.class)); // 出力 Csv.save(customers, file, cfg, new CsvEntityListHandler<Customer>(Customer.class));