値のコンバート設定
処理概要
ReplaceSchemaのデータ登録にて、データファイルに定義されている値をそのまま登録するのではなく、ある値にマッピングしたり変換をかけたりすることが可能です。 もともとはTSVやCSVでの利用を想定していた機能でしたが、エクセルデータでも利用することができます(@since 0.9.9.0A)。
使い方
データファイルと同じディレクトリに "convertValueMap.dataprop" という名前のテキストファイルを配置して、 カラム名とマッピングする値を定義します。すると、insert処理するときにマッピングした値で登録します。
e.g. TSVで定義されている一文字のコードを三文字のコードへ変換して登録 @convertValueMap.dataprop
map:{
MEMBER_STATUS_CODE = map:{ F = FML ; P = PRV ; W = WDL }
; [column-name] = map:{[mapping-definition]}
; ...
}
- 設定ファイル
- convertValueMap.dataprop (UTF-8)
- プロパティ
- カラム名とマッピングする値
マッピング定義の基本仕様
- カラム名は大文字小文字区別なし
- 値のマッピングは大文字小文字区別あり
- 定義された上から順番通りに変換処理が実行される
- 変換処理に複数該当する場合は該当した全ての変換処理が実行される
- 複数処理されるとき、次の変換処理の判定は前の変換処理が施された値に対して行われる
- 変換処理された場合は defaultValueMap.dataprop の処理対象外となる @since 0.9.8.2
- 変換処理された場合は 空文字を null として扱うデフォルトの挙動は無効になる @since 0.9.8.2
- 変換前の値の前に "contain:" を付けると、値に含まれているその文字が置換される @since 0.9.7.5
マッピング定義の制御文字
- 改行とタブを表現するために一部制御文字(\r, \n, \t)が利用できる @since 0.9.7.5
- 制御文字をエスケープして、制御文字自体を表現できる e.g. "\\r", "\\n", "\\t" @since 0.9.7.5
- エスケープ文字のエスケープはエスケープ文字でエスケープ e.g. "\\" @since 0.9.7.5
e.g. "\n" という文字を本物の改行に変換する @convertValueMap.dataprop
map:{
; CONVERTED_COLUMN = map:{
; contain:\\n = \n
}
...
}
マッピング定義のワイルドカード
- カラム名に $$ALL$$ と指定すると全てのカラムが変換対象 @since 0.9.7.5
- カラム名に $$type(VARCHAR)$$ と指定するとVARCHAR型のカラムが変換対象 @since 1.1.1
- カラム名に $$LINE$$ と指定すると分解する前の一行の文字列に対して置換(後述) @since 0.9.8.2
※$$type(VARCHAR)$$ の VARCHAR は任意のJDBC型に置き換えられます。(e.g. INTEgER, DATE)
e.g. 全てのカラムにおいて "\n" という文字を本物の改行に変換する @convertValueMap.dataprop
map:{
; $$ALL$$ = map:{
; contain:\\n = \n
}
...
}
マッピング定義のNullや空文字
- null や空文字を、それぞれ $$null$$ と $$empty$$ と指定できる @since 0.9.8.2
- TSVやCSVファイルの空っぽのデータは $$empty$$ でヒットさせることができる @until 1.1.1
- TSVやCSVファイルの空っぽのデータは $$null$$ でヒットさせることができる @since 1.1.2
- エクセルの空っぽのデータは $$null$$ でヒットさせることができる @until 1.1.0-sp9
※どのバージョンでも、どのファイル形式でも、デフォルトでは空データは null で登録されます。
e.g. VARCHAR型の空っぽの値(セル)を空文字として登録 @convertValueMap.dataprop
map:{
; $$type(VARCHAR)$$ = map:{
; $$null$$ = $$empty$$
}
...
}
分解前の行文字列を変換対象に
これはTSVやCSVなどのでデリミタデータのみの機能です。カラム名に $$LINE$$ と指定すると、一行の文字列をカラムに分解する前に変換処理を行います。 暗黙に "contains:" 指定がされているものとして処理されます。 どうしてもデータ仕様が合わないなど分解処理自体でエラーになってしまう場合に有効です。
例えば、データの中に、"ダブルクォーテーション(一つ) + タブ" という文字列があると、そのダブルクォーテーションは値の終端で、その次のタブは区切り文字、と判断され、正常に登録されません。 本来、値としてのダブルクォーテーションはもう一つダブルクォーテーションを並べてエスケープする必要がありますが、 どうしてもそのようなデータ形式にできない場合に、この機能を使って強制的にエスケープさせることでそのデータを正常に登録することができます。 MySQLの機能で取得したデリミタデータではダブルクォーテーションのエスケープがバックスラッシュで行われるため、その次の値にたまたまタブがあったりするとこの状況に当てはまります。 (最終手段と考えてください)
e.g. バックスラッシュによるエスケープをダブルクォーテーションに置換 @convertValueMap.dataprop
map:{
; $$LINE$$ = map:{
; \\\\ = \\
; \\" = ""
}
...
}
String型文字列の微調整
String特有の微調整変換処理を施すことができます。@since 1.1.2
e.g. 全ての String 型のカラムにて、null (値が存在しない) だったら空文字にする @convertValueMap.dataprop
map:{
$$ALL$$ = map:{ $$String$$ = $$NullToEmpty$$ }
; ...
}
Timestamp型文字列の微調整
Timestamp特有の微調整変換処理を施すことができます。@since 0.9.9.0A
例えば、"2011-07-29 12:34:56.8" という値がデータファイルに指定されていた場合、デフォルトでは "2011-07-29 12:34:56.008" として認識されます。"." 以降はミリ秒(SSS)を指定する領域となっているので、この場合つまりは 8 ミリ秒が指定されたとみなされます。
これを、プロジェクトの特性上、"2011-07-29 12:34:56.800" と認識したいという場合は、変換前の値に $$Timestamp$$ を指定し、変換後の値として $$ZeroSuffixMillis$$ を指定すると、Timestamp型のカラムの挙動がそのように変更されます。
e.g. 全ての Timestamp 型のカラムにて、不足桁のミリ秒の後ろに 0 を埋める @convertValueMap.dataprop
map:{
$$ALL$$ = map:{ $$timestamp$$ = $$ZeroSuffixMillis$$ }
; ...
}