9.11.1 フォーマット変換定義
(1) 記述形式
<FormatDefinition ioType="{INPUT|OUTPUT}">
<common>
<unmatchedFormat>{IGNORE|WARNING|ERROR}
</unmatchedFormat>
<format timestampformat="<形式番号>" year="<開始年>" month="<開始月>"/>
</common>
<records>
<record name="<レコード名>" exp="<レコード構成>"
timestampformat="<形式番号>" year="<開始年>" month="<開始月>">
<field name="<フィールド名>"
type="{INT|SHORT|BYTE|LONG|BIG_DECIMAL|FLOAT|DOUBLE|STRING|DATE|TIME|TIMESTAMP}"
pattern="<パターン>"/>
</record>
</records>
</FormatDefinition>
(2) 定義の詳細
- FormatDefinitionタグ(全体情報の定義)
- フォーマット変換定義の全体情報を定義します。この定義は必ず1個だけ記述します。
- ioType="{INPUT|OUTPUT}"
- この定義で指定する標準提供アダプターの種類を指定します。この属性は省略できません。
- 指定できる値を次に示します。
- INPUT
入力アダプターでフォーマット変換を定義する場合に指定します。
- OUTPUT
出力アダプターでフォーマット変換を定義する場合に指定します。
- commonタグ(共通定義)
- フォーマット変換定義の共通情報を定義します。この定義は必ず1個だけ記述します。
- unmatchedFormatタグ(変換パターンに一致しないレコードの定義)
- このタグでは,フォーマット変換のパターンに一致しないレコードを検知したときの対処を指定します。
- この定義は1個だけ記述できます。また,この定義は省略できます。省略した場合,ERRORが仮定されます。
- 指定できる値を次に示します。
- IGNORE
検知した内容を無視して,標準提供アダプターの処理を続行します。
- WARNING
警告メッセージを出力して,標準提供アダプターの処理を続行します。
- ERROR
エラーメッセージを出力して,標準提供アダプターを停止します。
- formatタグ(フォーマット定義)
- データ型種別で扱うTIMESTAMP型の文字列表現について定義します。この定義は1個だけ記述できます。また,TIMESTAMP型の文字列表現を使用しない場合,この定義は省略できます。
- timestampformat="<形式番号>"
- TIMESTAMP型の形式番号を1~4の整数で指定します。省略した場合,1が仮定されます。
- なお,formatタグのtimestampformat属性を指定し,かつrecordsタグのtimestampformat属性を指定した場合には,recordsタグでの指定内容が有効になります。
- 形式番号として指定できる値の意味を次の表に示します。
形式番号 | 文字列表現の形式 | 形式 |
---|
1(デフォルト値) | 年-月-日 時:分:秒.ミリ秒(1~9けた) | yyyy-MM-dd HH:mm:ss.fffffffff |
2※1 | 月名※2 日 時:分:秒 | MMM dd HH:mm:ss |
3 | 年/月/日 時:分:秒.ミリ秒(3けた) | yyyy/MM/dd HH:mm:ss.SSS |
4 | 日/月名※2/年:時:分:秒 | dd/MMM/yyyy:HH:mm:ss |
- 注※1
- 形式番号2は,形式に年がありません。このため,入力アダプターで形式番号2を指定する場合には,year属性およびmonth属性で開始年月を指定してください。出力アダプターで形式番号2を指定する場合には,year属性およびmonth属性は指定できません。
- なお,year属性およびmonth属性を指定しない場合,標準提供アダプターの起動時点のシステムの年月がTIMESTAMP型の開始年月となります。
- 注※2
- 英字3けたの英語の月名です。Jan(1月),Feb(2月),Mar(3月),Apr(4月),May(5月),Jun(6月),Jul(7月),Aug(8月),Sep(9月),Oct(10月),Nov(11月),Dec(12月)です。
- year="<開始年>"
- timestampformat属性で2を指定した場合,この属性でTIMESTAMP型の開始年を指定します。年は,1970~2261の整数で指定します。この属性は,出力アダプターの場合には指定できません。
- TIMESTAMP型の開始年月の指定については,「(4) TIMESTAMP型の開始年月の指定」を参照してください。
- month="<開始月>"
- timestampformat属性で2を指定した場合,この属性でTIMESTAMP型の開始月を指定します。年は,1~12の整数で指定します。この属性は,出力アダプターの場合には指定できません。
- TIMESTAMP型の開始年月の指定については,「(4) TIMESTAMP型の開始年月の指定」を参照してください。
- recordsタグ(レコード群定義)
- レコード群の情報を定義します。この定義は必ず1個だけ記述します。この定義は省略できません。
- recordタグ(レコード定義)
- 各レコードの情報を定義します。この定義は10個まで記述できます。この定義は省略できません。
- name="<レコード名>"
- レコードの情報を識別するための名称を1~100文字の半角英数字,およびアンダーライン(_)で指定します。先頭の文字に指定できるのは,半角英字だけです。
- レコード名は,recordsタグ内で一意となるように指定してください。この属性は省略できません。
- exp="<レコード構成>"
- レコードを構成するフィールドを1~1,000,000文字で指定します。
- レコード構成内に,このレコード固有の区切り文字を指定できます。また,フィールドごとに異なる区切り文字を指定することもできます。この属性は省略できません。
- レコード構成の記述形式については,「(5) レコード構成の記述形式」を参照してください。
- timestampformat="<形式番号>"
- TIMESTAMP型の形式番号を1~4の整数で指定します。省略した場合,formatタグのtimestampformat属性の指定値が仮定されます。
- なお,formatタグのtimestampformat属性を指定し,かつrecordsタグのtimestampformat属性を指定した場合には,recordsタグでの指定内容が有効になります。
- 形式番号として指定できる値の意味については,formatタグのtimestampformat属性の説明を参照してください。
- year="<開始年>"
- timestampformat属性で2を指定した場合,この属性でTIMESTAMP型の開始年を指定します。年は,1970~2261の整数で指定します。この属性は,出力アダプターの場合には指定できません。
- TIMESTAMP型の開始年月の指定については,「(4) TIMESTAMP型の開始年月の指定」を参照してください。
- month="<開始月>"
- timestampformat属性で2を指定した場合,この属性でTIMESTAMP型の開始月を指定します。年は,1~12の整数で指定します。この属性は,出力アダプターの場合には指定できません。
- TIMESTAMP型の開始年月の指定については,「(4) TIMESTAMP型の開始年月の指定」を参照してください。
- fieldタグ(フィールド定義)
- フィールド情報を定義します。この定義は3,000個まで記述できます。この定義は省略できません。
- name="<フィールド名>"
- フィールドの情報を識別するための名称を1~100文字の半角英数字,およびアンダーライン(_)で指定します。先頭の文字に指定できるのは,半角英字だけです。
- フィールド名は,recordsタグ内で一意となるように指定してください。この属性は省略できません。
- type="{INT|SHORT|BYTE|LONG|BIG_DECIMAL|FLOAT|DOUBLE|STRING|DATE|TIME|TIMESTAMP}"
- フィールドのJavaのデータ型に対応するデータ型を指定します。この属性は省略できません。
- この属性に指定する値と,対応するJavaのデータ型およびCQLのデータ型については,「(6) type属性の指定値と,対応するJavaのデータ型およびCQLのデータ型」を参照してください。
- pattern="<パターン>"
- type属性にSTRINGを指定した場合,フィールド値のパターンを正規表現で指定します。正規表現の解析には,java.util.regex.Patternクラスを使用します。このため,正規表現は,java.util.regex.Patternクラスがサポートする正規表現の範囲で記述してください。「$」は使用できません。
- なお,type属性にSTRING以外を指定している場合,または出力アダプターで定義している場合には,この属性は指定できません。指定した場合は,エラーとなります。
- パターンには定数が指定できます。パターンに定数が指定された場合,フィールド値を定数として扱います。
- この属性を省略した場合のデータ型種別の表記規則については,「(7) データ型種別の表記規則」を参照してください。
(3) 記述例
<?xml version="1.0" encoding="UTF-8"?>
<root:AdaptorCompositionDefinition
xmlns:form="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/FormatDefinition">
<!-- 途中略 -->
<!-- 編集用CB定義 -->
<cb:DataEditCBDefinition class="jp.co.Hitachi.soft.sdp.adaptor.callback.dataedit.formattranslate.InputFormatTranslatorCBImpl" name="editor1">
<!-- フォーマット変換定義 -->
<form:FormatDefinition ioType="INPUT">
<form:common/>
<!-- レコード群定義 -->
<form:records>
<form:record name="R1" exp="($_F1),($_F2),($_F3),($_F4),($_F5)">
<!-- フィールド定義 -->
<form:field name="F1" type="INT"/>
<form:field name="F2" type="STRING" pattern="[^,]*"/>
<form:field name="F3" type="STRING" pattern="[A-Z]+.[A-Z]+"/>
<form:field name="F4" type="INT"/>
<form:field name="F5" type="INT"/>
</form:record>
</form:records>
</form:FormatDefinition>
</cb:DataEditCBDefinition>
(4) TIMESTAMP型の開始年月の指定
入力アダプターでformatタグのtimestampformat属性に形式番号2を指定し,formatタグのyear属性およびmonth属性を指定した場合には,次のようにTIMESTAMP型のフィールドの開始年月が決定されます。
- 入力アダプター起動直後の一つ目の入力レコード
formatタグのyear属性およびmonth属性で指定した値が,TIMESTAMP型のフィールドの開始年月となります。
- 二つ目以降の入力レコード
前回の入力レコードのTIMESTAMP型のフィールドの年月を基準年月として,開始年月を決定します。
なお,二つ目以降の入力レコードの開始年月は,入力レコードのフィールドの月の値を基準年月と比較して,次のように決定されます。
- 「入力レコードのフィールドの月の値 >= 基準年月の前の月」の場合
基準年月の年がフィールドの年の値となります。ただし,基準年月の前の月が12月で,かつフィールドの月の値が12月の場合は,基準年月の前の年がフィールドの年の値となります。
- 「入力レコードのフィールドの月の値 < 基準年月の先月」の場合
基準年月の翌年がフィールドの年の値となります。ただし,基準年月の前の月が12月の場合は,基準年月の年がフィールドの年の値となります。
基準年月をY年4月とした場合の例を次の図に示します。入力レコードのフィールドの月の値が3~12の場合,フィールドの年の値はYとなります。月の値が1または2の場合,フィールドの年の値はY+1となります。
図9-3 基準年月をY年4月とした場合
![[図データ]](figure/zs090300.gif)
基準年月をY年1月とした場合の例を次の図に示します。入力レコードのフィールドの月の値が12の場合,フィールドの年の値はY-1となります。月の値が1~11の場合,フィールドの年の値はYとなります。
図9-4 基準年月をY年1月とした場合
![[図データ]](figure/zs090400.gif)
(5) レコード構成の記述形式
recordタグのexp属性で指定するレコード構成の記述形式について説明します。
記述形式を次に示します。
{〔<区切り文字指定>〕($<フィールド名指定>)〔<区切り文字指定>〕
|〔<区切り文字指定>〕($<フィールド名指定>)〔<区切り文字指定>〕…}
- <区切り文字指定>
- このレコードを構成する個々のフィールドを区切る文字列を指定します。FormatDefinitionタグのioType属性がINPUTの場合,文字列として正規表現が使用できます。正規表現で特別な意味を持つ文字(「(」,「)」,「[」,「]」,「{」,「}」,「-」,「|」,「/」,「¥」,「.」,「*」,「?」,「+」,「^」,「$」)を本来の文字として指定するには,円記号(¥)でエスケープする必要があります。
- FormatDefinitionタグのioType属性がOUTPUTの場合,文字列として正規表現を使用できません。そのため,正規表現で特別な意味を持つ文字に対してエスケープする必要はありません。
- <フィールド名指定>
- このレコードを構成する個々のフィールド名を指定します。
レコード構成の記述規則を次に示します。
- 区切り文字指定に対するダブルクォーテーション(")は不要です。
- フィールド名の指定の先頭には「($_」を,末尾には「)」を指定してください。
- フィールド名の指定では,このレコードを構成するすべてのフィールド名を指定してください。
- fieldタグでは,このレコードを構成するフィールド名を左から順番に指定してください。
- フィールド名の指定では,このレコードを構成するフィールド名を重複して指定できません。また,このレコードを構成するフィールド名以外のフィールド名は指定できません。
- 特殊文字を使用する場合は,文字を置換してください。文字の置換については,「9.2 アダプター用定義ファイル作成上の注意事項」の特殊文字(記号)の対応表を参照してください。
レコード構成の記述例を次に示します。
- 記述例1
- フィールドF1~F5という五つのフィールドがある。
- すべてのフィールドは,コンマ「,」で区切られている。
- このようなレコードのレコード構成は次のように記述します。
"($_F1),($_F2),($_F3),($_F4),($_F5)"
- 記述例2
- フィールドF1~F3という三つのフィールドがある。
- レコードの先頭が「<」で始まる。
- フィールドF1とフィールドF2が「> MSG」の区切り文字で区切られている。
- フィールドF2とフィールドF3が半角スペースの区切り文字で区切られている。
- このようなレコードのレコード構成は次のように記述します。
"<($_F1)> MSG($_F2) ($_F3)"
- 「<」と「>」は特殊文字のため,それぞれ「<」および「>」に置き換えます。
(6) type属性の指定値と,対応するJavaのデータ型およびCQLのデータ型
fieldタグのtype属性の指定値と,対応するJavaのデータ型およびCQLのデータ型を次の表に示します。
なお,各データ型の表記規則については,fieldタグのpattern属性の各データ型種別の表記規則の説明を参照してください。また,CQLのデータ型については,マニュアル「uCosminexus Stream Data Platform - Application Framework アプリケーション開発ガイド」を参照してください。
表9-12 type属性の指定値と,対応するJavaのデータ型およびCQLのデータ型
項番 | データ型種別 (type属性の指定値) | 分類 | データ形式 | Javaのデータ型 | CQLのデータ型 |
---|
1 | INT | 数値データ | 整数型4バイト | プリミティブ型int | INT〔EGER〕 |
2 | SHORT | 整数型2バイト | プリミティブ型short | SMALLINT |
3 | BYTE | 整数型1バイト | プリミティブ型byte | TINYINT |
4 | LONG | 整数型8バイト | プリミティブ型long | BIGINT |
5 | BIG_DECIMAL | 固定小数点数 | java.math.BigDecimalクラス | DEC〔IMAL〕※1 NUMERIC※1 |
6 | DECIMAL(m)※2 NUMERIC(m)※2 |
7 | FLOAT | 実数型4バイト | プリミティブ型float | REAL |
8 | DOUBLE | 実数型8バイト | プリミティブ型double | FLOAT DOUBLE |
9 | STRING | 文字データ | 文字列 | java.lang.Stringクラス | CHAR〔ACTER〕※3 |
10 | CHAR〔ACTER〕(n)※4 VARCHAR(p)※5 |
11 | DATE | 日付/時刻データ | 日付(年月日) | java.sql.Dateクラス | DATE |
12 | TIME | 時間(時分秒) | java.sql.Timeクラス | TIME |
13 | TIMESTAMP | 日時(年月日+時分秒+ナノ秒) | java.sql.Timestampクラス | TIMESTAMP※6 |
14 | TIMESTAMP〔(q)〕※7 |
- 注※1
- けた数として15を仮定します。けた数が15を超える場合,タプル送信時にエラーとなります。
- 注※2
- mは正整数で,1≦m≦38です。けた数がmを超える場合,タプル送信時にエラーとなります。
- 注※3
- 文字数として1を仮定します。文字数が1を超える場合,タプル送信時にエラーとなります。
- 注※4
- nは正整数で,1≦n≦255です。文字数がnを超える場合,タプル送信時にエラーとなります。
- 注※5
- pは正整数で,1≦p≦32767です。文字数がpを超える場合,タプル送信時にエラーとなります。
- 注※6
- 年月日+時分秒+ミリ秒(3けた)を仮定します。ミリ秒以上の精度を指定した場合,タプル送信エラーとなります。
- 注※7
- qは整数で,0≦q≦9です。qは小数秒以下のけた数を示します。けた数にq以上の精度を指定した場合,タプル送信エラーとなります。
(7) データ型種別の表記規則
fieldタグのpattern属性を省略した場合のデータ型種別の表記規則を次の表に示します。
表9-13 fieldタグのpattern属性を省略した場合のデータ型種別の表記規則
項番 | データ型種別 (type属性の指定値) | 各データ型のパターン (正規表現) | 説明 | 変更の可否※ |
---|
1 | INT | "〔-〕{0,1}〔0-9〕+" | 先頭がマイナス(-)の符号が0回または1回出現し,さらに0~9の数字が1回以上繰り返される文字列のパターンです。 | × |
2 | SHORT | × |
3 | BYTE | × |
4 | LONG | × |
5 | BIG_DECIMAL | "〔-〕{0,1}〔0-9〕+¥.〔0-9〕+" | 次の文字列のパターンです。
- 先頭がマイナス(-)の符号が0回または1回出現します。
- 0~9の数字が1回以上繰り返されます。
- ピリオド(.)を挟んで,0~9の数字が1回以上繰り返されます。
| × |
6 | FLOAT | "〔-〕{0,1}〔0-9〕+¥.〔0-9〕+" | 次の文字列のパターンです。
- 先頭がマイナス(-)の符号が0回または1回出現します。
- 0~9の数字が1回以上繰り返されます。
- ピリオド(.)を挟んで,0~9の数字が1回以上繰り返されます。
| × |
7 | DOUBLE | × |
8 | STRING | "〔^, ;〕*" | スペース,コンマ(,),およびセミコロン(;)を除く任意の文字が繰り返される文字列のパターンです。 データ型種別がSTRINGの場合,パターンの変更(指定)ができます。
- パターン変更(指定)例
- 区切り文字にピリオド(.)だけを使用する場合
- "〔^ .〕+"
| ○ |
9 | DATE | "〔0-9〕{1,4}-〔0-9〕{1,2}-〔0-9〕{1,2}" | yyyy-mm-dd形式の文字列のパターンです。ただし,指定できる文字は次の範囲とし,けた数だけチェックします。
- yyyy:0~9999の数字
- mm:0~99の数字
- dd:0~99の数字
mm,ddがそれぞれMM,DDの指定範囲外の値の場合,エラーメッセージKFSP46322-Eが出力されます。 | × |
10 | TIME | "〔0-9〕{1,2}:〔0-9〕{1,2}:〔0-9〕{1,2}" | hh:mm:ss形式の文字列のパターンです。ただし,指定できる文字は次の範囲とし,けた数だけチェックします。
- hh:0~99の数字
- mm:0~99の数字
- ss:0~99の数字
hh,mm,ssがそれぞれHH,MM,SSの指定範囲外の値の場合,java.sql.Timeの仕様に準拠して正規の時刻に換算します。
- (例)
- 16:22:66→16:23:06
| × |
11 | TIMESTAMP | 条件によって異なります。詳細については「表9-14 データ型種別がTIMESTAMPの場合の表記規則」を参照してください。 | 条件によって異なります。詳細については「表9-14 データ型種別がTIMESTAMPの場合の表記規則」を参照してください。 | × |
- (凡例)
- ○:変更できます。
- ×:変更できません。
- 注※
- pattern属性を指定することで,各データ型種別の文字列のパターンを変更できるかどうかを表します。
表9-14 データ型種別がTIMESTAMPの場合の表記規則
条件 | 各データ型のパターン (正規表現) | 説明 |
---|
timestampformat属性の値が1の場合 | "[0-9]{1,4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2} ¥.[0-9]{1,9}" | yyyy-mm-dd hh:mm:ss.fffffffff形式の文字列のパターンです。ただし,指定できる文字は次の範囲とし,けた数だけチェックします。※
- yyyy:0~9999の数字
- mm:0~99の数字
- dd:0~99の数字
- hh:0~99の数字
- mm:0~99の数字
- ss:0~99の数字
- fffffffff:0~999999999の数字
|
timestampformat属性の値が2の場合 | "[A-Za-z]{3}[ ]+[0-9]{1,2}[ ]+[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}" | MMM dd HH:mm:ss形式の文字列のパターンです。ただし,指定できる文字は次の範囲とし,けた数だけチェックします。※
- MMM:A~Z,a~zの英字(3けたの英語の月名)
- dd:0~99の数字
- HH:0~99の数字
- mm:0~99の数字
- ss:0~99の数字
|
timestampformat属性の値が3の場合 | "[0-9]{1,4}/[0-9]{1,2}/[0-9]{1,2}[ ]+[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}¥.[0-9]{3}" | yyyy/MM/dd HH:mm:ss.SSS形式の文字列のパターンです。ただし,指定できる文字は次の範囲とし,けた数だけチェックします。※
- yyyy:0~9999の数字
- MM:0~99の数字
- dd:0~99の数字
- HH:0~99の数字
- mm:0~99の数字
- ss:0~99の数字
- SSS:000~999の数字
|
timestampformat属性の値が4の場合 | "[0-9]{1,2}/[A-Za-z]{3}/[0-9]{1,4}:[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}" | dd/MMM/yyyy:HH:mm:ss形式の文字列のパターンです。ただし,指定できる文字は次の範囲とし,けた数だけチェックします。※
- dd:0~99の数字
- MMM:A~Z,a~zの英字(3けたの英語の月名)
- yyyy:0~9999の数字
- HH:0~99の数字
- mm:0~99の数字
- ss:0~99の数字
|
- 注※
- mm,dd,hh,mm,ssがそれぞれMM(月),DD,HH,MM(分),SSの指定範囲外の値の場合,java.sql.Timestampの仕様に準拠して正規の年月日時刻に換算します。
- (例)
- 2001-13-10 16:22:66.101→2002-01-10 16:23:06.101