9.11.1 フォーマット変換定義

フォーマット変換定義(FormatDefinitionタグ)は,「9.9.3 編集用CB定義」で説明した編集用CB定義(DataEditCBDefinitionタグ)の子要素として定義します。

なお,フォーマット変換の処理については,「11.2.2(3) フォーマット変換」,または「11.6.2(4) フォーマット変換」を参照してください。

<この項の構成>
(1) 記述形式
(2) 定義の詳細
(3) 記述例
(4) TIMESTAMP型の開始年月の指定
(5) レコード構成の記述形式
(6) type属性の指定値と,対応するJavaのデータ型およびCQLのデータ型
(7) データ型種別の表記規則

(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型のフィールドの開始年月が決定されます。

なお,二つ目以降の入力レコードの開始年月は,入力レコードのフィールドの月の値を基準年月と比較して,次のように決定されます。

基準年月をY年4月とした場合の例を次の図に示します。入力レコードのフィールドの月の値が3~12の場合,フィールドの年の値はYとなります。月の値が1または2の場合,フィールドの年の値はY+1となります。

図9-3 基準年月をY年4月とした場合

[図データ]

基準年月をY年1月とした場合の例を次の図に示します。入力レコードのフィールドの月の値が12の場合,フィールドの年の値はY-1となります。月の値が1~11の場合,フィールドの年の値はYとなります。

図9-4 基準年月をY年1月とした場合

[図データ]

(5) レコード構成の記述形式

recordタグのexp属性で指定するレコード構成の記述形式について説明します。

記述形式を次に示します。

{〔<区切り文字指定>〕($<フィールド名指定>)〔<区切り文字指定>〕
|〔<区切り文字指定>〕($<フィールド名指定>)〔<区切り文字指定>〕…}

<区切り文字指定>
このレコードを構成する個々のフィールドを区切る文字列を指定します。FormatDefinitionタグのioType属性がINPUTの場合,文字列として正規表現が使用できます。正規表現で特別な意味を持つ文字(「(」,「)」,「[」,「]」,「{」,「}」,「-」,「|」,「/」,「¥」,「.」,「*」,「?」,「+」,「^」,「$」)を本来の文字として指定するには,円記号(¥)でエスケープする必要があります。
FormatDefinitionタグのioType属性がOUTPUTの場合,文字列として正規表現を使用できません。そのため,正規表現で特別な意味を持つ文字に対してエスケープする必要はありません。
<フィールド名指定>
このレコードを構成する個々のフィールド名を指定します。

レコード構成の記述規則を次に示します。

レコード構成の記述例を次に示します。

記述例1
  • フィールドF1~F5という五つのフィールドがある。
  • すべてのフィールドは,コンマ「,」で区切られている。
このようなレコードのレコード構成は次のように記述します。

"($_F1),($_F2),($_F3),($_F4),($_F5)"

記述例2
  • フィールドF1~F3という三つのフィールドがある。
  • レコードの先頭が「<」で始まる。
  • フィールドF1とフィールドF2が「> MSG」の区切り文字で区切られている。
  • フィールドF2とフィールドF3が半角スペースの区切り文字で区切られている。
このようなレコードのレコード構成は次のように記述します。

"&lt;($_F1)&gt; MSG($_F2) ($_F3)"

「<」と「>」は特殊文字のため,それぞれ「&lt;」および「&gt;」に置き換えます。

(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のデータ型
1INT数値データ整数型4バイトプリミティブ型intINT〔EGER〕
2SHORT整数型2バイトプリミティブ型shortSMALLINT
3BYTE整数型1バイトプリミティブ型byteTINYINT
4LONG整数型8バイトプリミティブ型longBIGINT
5BIG_DECIMAL固定小数点数java.math.BigDecimalクラスDEC〔IMAL〕※1
NUMERIC※1
6DECIMAL(m)※2
NUMERIC(m)※2
7FLOAT実数型4バイトプリミティブ型floatREAL
8DOUBLE実数型8バイトプリミティブ型doubleFLOAT
DOUBLE
9STRING文字データ文字列java.lang.StringクラスCHAR〔ACTER〕※3
10CHAR〔ACTER〕(n)※4
VARCHAR(p)※5
11DATE日付/時刻データ日付(年月日)java.sql.DateクラスDATE
12TIME時間(時分秒)java.sql.TimeクラスTIME
13TIMESTAMP日時(年月日+時分秒+ナノ秒)java.sql.TimestampクラスTIMESTAMP※6
14TIMESTAMP〔(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属性の指定値)
各データ型のパターン
(正規表現)
説明変更の可否
1INT"〔-〕{0,1}〔0-9〕+"先頭がマイナス(-)の符号が0回または1回出現し,さらに0~9の数字が1回以上繰り返される文字列のパターンです。×
2SHORT×
3BYTE×
4LONG×
5BIG_DECIMAL"〔-〕{0,1}〔0-9〕+¥.〔0-9〕+"次の文字列のパターンです。
  • 先頭がマイナス(-)の符号が0回または1回出現します。
  • 0~9の数字が1回以上繰り返されます。
  • ピリオド(.)を挟んで,0~9の数字が1回以上繰り返されます。
×
6FLOAT"〔-〕{0,1}〔0-9〕+¥.〔0-9〕+"次の文字列のパターンです。
  • 先頭がマイナス(-)の符号が0回または1回出現します。
  • 0~9の数字が1回以上繰り返されます。
  • ピリオド(.)を挟んで,0~9の数字が1回以上繰り返されます。
×
7DOUBLE×
8STRING"〔^, ;〕*"スペース,コンマ(,),およびセミコロン(;)を除く任意の文字が繰り返される文字列のパターンです。
データ型種別がSTRINGの場合,パターンの変更(指定)ができます。
パターン変更(指定)例
区切り文字にピリオド(.)だけを使用する場合
"〔^ .〕+"
9DATE"〔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が出力されます。
×
10TIME"〔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
×
11TIMESTAMP条件によって異なります。詳細については「表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