ページの先頭行へ戻る
Big Data Integration ServerV1.2.0 加工編導入・運用ガイド
FUJITSU Software

3.3.2 いろいろなデータ連結方法

Data Effectorの連結機能には、以下に示すいろいろな連結方法があります。これらを組み合わせることで、多種多様な業務要件に対応できます。

3.3.2.1 大量のマスタデータと連結する場合

ジャーナルデータを大量のマスタデータと連結する場合、マシンのメモリを大量に使用してしまい、他のプロセスの動作に影響が出てしまうことがあります。連結機能で使用するメモリ量と作業ディレクトリ(一時ファイル)を設定することで、大量データの連結処理ができます。
メモリ量を指定することで、指定した一定のメモリ量の範囲で連結機能が動作します。
さらに、指定したメモリ量を超えると、自動的に一時ファイル使用に切り替わります。
これを、連結機能の一時ファイル処理と呼びます。

shunreplaceコマンド利用時は、replace用動作環境ファイルのWorkFolderパラメタと連結条件ファイルのMemorySizeパラメタを指定します。

C API 利用時は、AsisSetEnvReplace関数のWorkFolderパラメタとMemorySizeパラメタを指定します。

統合コマンド利用時は、統合定義ファイルの処理条件定義部:ReplaceのWorkFolderタグとMemoryタグで指定します。

参照

指定書式の詳細については、“リファレンス集”の以下を参照してください。

  • shunreplaceコマンド利用時は “ replace用動作環境ファイル”および“連結条件ファイル”

  • C API利用時は “AsisSetEnvReplace”

  • 統合定義ファイル利用時は、“処理条件定義部:Replace”


3.3.2.2 見出し行(項目名)のないCSVファイルを扱う場合

CSV形式の入力ジャーナルファイルや入力マスタファイルには、見出し行(項目名)を持たない場合があります。このようなデータだけのファイルも、加工せずにData Effectorで連結できます。見出し行だけのファイルをスキーマ情報ファイルとして別に定義しておけば、データファイルと合わせて処理します。

shunreplaceコマンド利用時は、replace用動作環境ファイルのJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
C API利用時は、AsisInitReplace関数のJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
統合コマンド利用時は、統合定義ファイルの処理条件定義部:ReplaceのJnlFileタグとMstFileタグのSchemaFile属性に、スキーマ情報ファイルを指定します。

参照

スキーマ情報ファイルの内容については、“2.1.1 CSV形式の場合”を参照してください。

スキーマ情報ファイルの指定方法については、“リファレンス集”の以下を参照してください。

  • shunreplaceコマンド利用時は “ replace用動作環境ファイル”

  • C API利用時は “AsisInitReplace”

  • 統合定義ファイル利用時は、 “処理条件定義部:Replace”


3.3.2.3 部分一致項目を連結する場合

入力ジャーナルファイルの項目が、入力マスタファイルの項目と部分一致する場合があります(入力マスタファイルの項目が入力ジャーナルファイルの項目に含まれるなど)。
この場合は、連結条件で入力ジャーナルファイルの項目と入力マスタファイルの項目を部分一致させて連結し、結果をファイルに出力できます。
例として、入力ジャーナルファイルの項目に複数の内容(店舗名)が含まれる場合に、入力マスタファイルの項目とそれぞれ一致させる場合を示します。


入力ジャーナルファイル

"date","detail","trg"
"20070528","空調点検","[品川店]"
"20070529","空調点検","[横浜店][川崎店]"
"20070530","空調点検","[新横浜店]"

入力マスタファイル

"tenpo","name"
"品川店","佐藤"
"川崎店","山田"
"横浜店","鈴木"
"新横浜店","田中"

連結条件

連結条件式  
(Jcondition)
 {join (Jnl,Mst,$trg = "[" + $tenpo+ "]", "LEFT OUTER") }
リターン式
(OutputDef)
 { $date 日付, $tenpo 店舗名, $name 担当者, $detail 作業内容 }


連結結果

"日付","店舗名","担当者","作業内容"
"20070528","品川店","佐藤","空調点検"
"20070529","横浜店","鈴木","空調点検"
"20070529","川崎店","山田","空調点検"
"20070530","新横浜店","田中","空調点検"

参考

入力ジャーナルファイルの日付が“20070529”のレコードは、入力マスタファイルの店舗名“横浜店”と“川崎店”の2つが含まれるため、それぞれに対する連結結果が出力されます。
入力ジャーナルファイルの項目の“新横浜店”と入力マスタファイルの“横浜店”を関連付けないようにするため、Jconditionパラメタに区切りとなる文字“[“および”]”を使用しています。


3.3.2.4 同じジャーナルファイル同士を連結する

同一の入力ジャーナルファイルを連結して、別のレコードに存在する値を表示したい場合があります。これをセルフジョイン(自己結合)といいます。
この場合は、1つの入力ファイルをそれぞれ、入力ジャーナルファイルと入力マスタファイルとして定義して結合させます。連結条件には、“完全一致”を使います。

例えば、以下のような入力ジャーナルファイルにおいて、「上司がID表記で、誰か分からないので、名前を表示したい」という要件があったとします。

処理の概要を以下に示します。

図3.3 セルフジョインの概要


例を以下に示します。

入力ジャーナルファイルおよび入力マスタファイル

"ID","氏名","部署名","上司ID","生年月日","住所","備考"
"101010","井上 一郎","1開発部","100001","19590101","静岡県・・・","部長"
"151515","林田 高","1開発部","101010","19700515","静岡県・・・","課長"
"123456","田中 刑事","1開発部","151515","19800805","静岡県・・・",
"123657","高島 一郎","1開発部","151515","19550708","静岡県・・・",

連結条件

入力項目定義
(ListDef)
 {
    document(Journal){
       $JID           ID,
       $J氏名         氏名,
       $J部署         部署名,
       $J上司ID       上司ID
       },
    document(Master){
       $MID           ID,
       $M氏名         氏名,
       $M部署         部署名,
       $M上司ID       上司ID
       }
  }
連結条件式  
(Jcondition)
{ join (Journal,Master,$J上司ID == $MID, "LEFT OUTER") }
リターン式
(OutputDef)
{$JID ID, $J氏名 氏名, $M氏名  上司氏名 }

連結結果

ID

氏名

上司氏名

101010

井上 一郎

151515

林田 高

井上 一郎

123456

田中 刑事

林田 高

123657

高島 一郎

林田 高

「空」がわかりやすいように、表形式にしています。


3.3.2.5 複数の項目を突き合わせて連結する場合

入力ジャーナルファイルのデータが2つ以上の項目で一意になる場合があります。

ここでは、2つの数値項目同士を比較したいので、セパレータとして「|」を使用します。

処理の概要を以下に示します。

ポイント

セパレータとは、データの区切りに使う記号や制御文字のことです。
たとえば、CSV形式のカンマ(,)、タブ区切りのタブ記号、プログラミングでのセミコロン(;),中括弧({,})などがあります。セパレータには、データ中に存在しない文字を使用してください。以下の例では英数字の項目を比較しているので、セパレータとして文字列の「|」を利用しています。プログラミングで使用する「パイプ」ではありません。

図3.4 複数の項目を突き合わせて連結する


例を以下に示します。

入力ジャーナルファイル1

"会社ID","従業員ID","出張日","交通費"
"1011","A1010","20091101","7800"
"1011","A1111","20091101","3400"

入力ジャーナルファイル2

"会社ID","従業員ID","出張日","交通費"
"101","1A1010","20091101","3400"
"101","1A1211","20091101","23500"

入力マスタファイル

"会社ID","会社名","従業員ID","氏名"
"1011","AA株式会社","A1010","井上一郎"
"1011","AA株式会社","A1111","高島一郎"
"101","XX産業","1A1010","中川二郎"
"101","XX産業","1A1211","中沢二郎"

連結条件

入力項目定義
(ListDef)
 {
  document(Journal){
    $J会社ID         会社ID,
    $J従業員ID       従業員ID,
    $出張日          出張日,
    $交通費          交通費
    },
  document(Master){
    $M会社ID         会社ID,
    $会社名          会社名,
    $M従業員ID       従業員ID,
    $氏名            氏名
    }
}
連結条件式  
(Jcondition)
{ join
 (Journal,Master,
  concat($J会社ID;"|";$J従業員ID) == concat($M会社ID;"|";$M従業員ID), "INNER") }
リターン式
(OutputDef)
 {$会社名 会社名, $J従業員ID 従業員ID, $氏名 氏名, $交通費 交通費}

連結結果

"会社名","従業員ID","氏名","交通費"
"AA株式会社","A1010","井上一郎","7800"
"AA株式会社","A1111","高島一郎","3400"
"XX産業","1A1010","中川二郎","3400"
"XX産業","1A1211","中沢二郎","23500"

注意

以下のように、連結時の結合関係式で項目だけを並べると、データ値がつながり、別の値になってしまいます。必ず、連結キーに含まれない文字(セパレータ)を項目間に指定してください。


図3.5 間違った連結例



3.3.2.6 XML形式同士を連結する場合

XML形式の入力ジャーナルファイルとXML形式の入力マスタファイルを連結して、XML形式で出力します。
この場合、リターン式の出力形式に、出力したいXML形式を指定します。

入力ジャーナルファイル

<Jnl>
     <Head>
        <Kbn>01</Kbn>
        <Number>1000</Number>
     </Head>
     <Body>
        <Meisai>
          <Code>AAA</Code>
          <Name>ブロックA</Name>
          <Value>1000</Value>
        </Meisai>
    </Body>
    <Tail>
      <Total>3000</Total>
      <Biko>備考:稟議番号  第4023号</Biko>
    </Tail>
</Jnl>

入力マスタファイル

<Mst1>
  <code>01</code>
  <name>設備</name>
</Mst1>
<Mst2>
  <code>1000</code>
  <name>第1開発部</name>
</Mst2>

連結条件ファイル

入力項目定義
(ListDef)
{
   document(Journal){
            $Kbn    /Jnl/Head/Kbn/text(),
            $Number /Jnl/Head/Number/text(),
            $Code   /Jnl/Body/Meisai/Code/text(),
            $Name   /Jnl/Body/Meisai/Name/text(),
            $Val    /Jnl/Body/Meisai/Value/text()
     },
   document(Master1){
            $Kcode /Mst1/code/text(),
            $Kname /Mst1/name/text()
     },
   document(Master2){
            $Ncode /Mst2/code/text(),
            $Nname /Mst2/name/text()
    }
}
連結条件式  
(Jcondition)
  {join (Journal, Master1, $Kbn == $Kcode, "LEFT OUTER"),
   join (Journal, Master2, $Number == $Ncode, "LEFT OUTER")
}
リターン式
(OutputDef)
出力形式
{"HEAD{<?xml version="1.0" encoding="Shift-Jis" ?>\n<Jnl>}
  DATA{
 <Body>
   <Kbn>%1%</Kbn>
   <Kname>%7%</Kname>
   <Number>%2%</Number>
   <Code>%3%</Code>
   <Name>%4%</Name>
   <Value>%5%</Value>
 </Body>\n}
  TAIL{</Jnl>}"
リターン項目
  $Kbn,$Number,$Code,$Name,$Val,$Kcode,$Kname,$Ncode,$Nname}

連結コマンドの出力例

<?xml version="1.0" encoding="Shift-Jis" ?>
<Jnl>
 <Body>
   <Kbn>01</Kbn>
   <Kname>設備</Kname>
   <Number>1000</Number>
   <Code>AAA</Code>
   <Name>ブロックA</Name>
   <Value>1000</Value>
 </Body>
</Jnl>

ポイント

以下に、リターン式における出力形式とリターン項目の関係について解説します。

出力形式には、出力したい形式(項目名やタグ名とその並び)を指定します。
リターン項目には、出力したい内容(項目名や関数)を指定します。
DATA部にリターン項目を埋め込む場合、項目指定子を「%項目番号%」の形式で指定します。

参照

  • 出力形式とリターン項目の詳細については、“リファレンス集”の“連結機能のリターン式”を参照してください。

  • 項目指定子と項目番号の詳細については、“リファレンス集”の“連結機能のリターン式”の“出力形式の構成要素”を参照してください。


3.3.2.7 繰返し項目のあるXML文書を連結する場合

入力ジャーナルファイルの繰返しノードを1レコードとしてファイルに出力できます。
例として、/Jnl/Body/Meisaiノードが1レコード中に繰り返し記述されており、/Jnl/Body/Meisaiノード単位に連結結果を出力することを想定します。繰返し項目のあるXMLを連結する場合、連結条件ファイルのListDefパラメタでは、レコードノード指定を使って定義します。

入力ジャーナルファイル

<Jnl>
     <Head>
        <Kbn>01</Kbn>
        <Number>1000</Number>
     </Head>
     <Body>
        <Meisai>
          <Code>AAA</Code>
          <Name>ブロックA</Name>
          <Value>1000</Value>
        </Meisai>
        <Meisai>
          <Code>BBB</Code>
          <Name>ブロックB</Name>
          <Value>1200</Value>
        </Meisai>
       <Meisai>
         <Code>CCC</Code>
         <Name>ブロックC</Name>
         <Value>800</Value>
       </Meisai>
    </Body>
    <Tail>
      <Total>3000</Total>
      <Biko>備考:稟議番号  第4023号</Biko>
    </Tail>
</Jnl>

入力マスタファイル

<Mst1>
  <code>01</code>
  <name>設備</name>
</Mst1>
<Mst2>
  <code>1000</code>
  <name>第1開発部</name>
</Mst2>

連結条件

入力項目定義
(ListDef)
{
   document(Journal)/Jnl/Body/Meisai{
            $Kbn    (../../Head/Kbn/text())[1],
            $Number (../../Head/Number/text())[1],
            $Code   (./Code/text())[1],
            $Name   (./Name/text())[1],
            $Val    (./Value/text())[1]
   },
   document(Master1){
            $Kcode /Mst1/code/text(),
            $Kname /Mst1/name/text()
   },
   document(Master2){
            $Ncode /Mst2/code/text(),
            $Nname /Mst2/name/text()
   }
}
連結条件式  
(Jcondition)
   {join (Journal, Master1, $Kbn == $Kcode, "LEFT OUTER"),
    join (Journal, Master2, $Number == $Ncode, "LEFT OUTER")
}
リターン式
(OutputDef)
{
"HEAD{<?xml version="1.0" encoding="Shift-Jis" ?>\n<Jnl>\n}
 DATA{ <Body>
  <型番>%1%</型番>
  <型名>%7%</型名>
  <番号>%2%</番号>
  <コード>%3%</コード>
  <製品名>%4%</製品名>
  <価格>%5%</価格>
 </Body>\n}
 TAIL{</Jnl>}"
 $Kbn,$Number,$Code,$Name,$Val,$Kcode,$Kname,$Ncode,$Nname}

ポイント

レコードノード指定では、まず基点となるコンテキストノードを決めます。コンテキストノードには、連結結果を出力する単位となるノードを設定すると便利です。

次に、抽出したい項目に対して、コンテキストノードからの相対的な位置を定義します。

以下に、入力データとListDefパラメタのレコードノード指定の対応例を示します。



連結コマンドの出力例

以下のように、指定された繰返し項目数分のレコードを生成します。

<?xml version="1.0" encoding="Shift-Jis" ?>
<Jnl>
 <Body>
  <型番>01</型番>
  <型名>設備</型名>
  <番号>1000</番号>
  <コード>AAA</コード>
  <製品名>ブロックA</製品名>
  <価格>1000</価格>
 </Body>
 <Body>
  <型番>01</型番>
  <型名>設備</型名>
  <番号>1000</番号>
  <コード>BBB</コード>
  <製品名>ブロックB</製品名>
  <価格>1200</価格>
 </Body>
 <Body>
  <型番>01</型番>
  <型名>設備</型名>
  <番号>1000</番号>
  <コード>CCC</コード>
  <製品名>ブロックC</製品名>
  <価格>800</価格>
 </Body>
</Jnl>

参照

レコードノード指定の詳細については、“リファレンス集”の“連結条件式”を参照してください。

3.3.2.8 入力マスタファイルに合致したジャーナルデータだけを出力する場合

入力ジャーナルファイルのデータで、連結条件に一致するデータが入力マスタファイルに存在しない場合、その入力ジャーナルファイルのデータは出力する必要がない場合があります。このような場合、INNER JOIN方式で連結します。この場合、連結条件式の結合型に“INNER”を指定します。

これに対して、連結条件に一致するデータが入力マスタファイルに存在しない場合でも、入力ジャーナルファイルのデータを出力するときは、LEFT OUTER JOIN方式で連結します。この場合、連結条件式の結合型に“LEFT OUTER”を指定します。

参照

連結条件式の詳細については、“リファレンス集”の“連結条件式”を参照してください。

商品番号と個数が記述された入力ジャーナルファイルと、商品番号に対する単価が記述された入力マスタファイルを連結し、商品についての小計(単価×個数)を計算します。
ここでは、入力マスタファイルに存在するデータだけ出力したいので、INNER JOIN方式で連結します。


入力ジャーナルファイル

"日付","番号","個数"
"20100603","A03",3
"20100603","A01",24
"20100604","A04",1
"20100605","A01",60

入力マスタファイル

"コード","商品名","価格"
"A01","鉛筆","60"
"A02","赤鉛筆","100"
"A03","消しゴム","80"

連結条件

入力項目定義
(ListDef)
 {
   document(Journal){
        $Jdate         日付,
        $Jno           番号,
        $Jcnt          個数
        },
   document(Master){
        $Mcode         コード,
        $Mgname        商品名,
        $Mvalu         価格
        }
 }
連結条件式  
(Jcondition)
 { join (Journal, Master, $Jno == $Mcode ,"INNER") }
リターン式
(OutputDef)
 { $Jdate 日付, $Mgname 商品名, $Mvalu 単価, $Jcnt 個数, val($Mvalu) * val($Jcnt) 小計 }

連結結果

"日付","商品名","単価","個数","小計"
"20100603","消しゴム","80","3",240
"20100603","鉛筆","60","24",1440
"20100605","鉛筆","60","60",3600

"A04"は入力マスタファイルに無いため、出力されません。

ポイント

同じ条件で、さらにreplace用動作環境ファイルのExceptRecordFolderパラメタを指定すると、未連結のジャーナルレコードが出力されます。例を以下に示します。

連結条件
連結条件式  
(Jcondition)
 { join (Jnl, Mst, $Jno == $Mcode ,"INNER") }
リターン式
(OutputDef)
 { $Jdate 日付, $Mgname 商品名, $Mvalu 単価, $Jcnt 個数, val($Mvalu) * val($Jcnt) 小計 }
replace用動作環境ファイル
# 入力ジャーナルファイル
JnlFile    Journal "..\data\in.csv" 
# 出力ファイル
OutFile    "..\result\out.csv"
・・・
# 未連結のジャーナルレコード
ExceptRecordFolder   "..\exp1"
連結結果

\result\out.csv

"日付","商品名","単価","個数","小計"
"20100603","消しゴム","80","3",240
"20100603","鉛筆","60","24",1440
"20100605","鉛筆","60","60",3600
未連結のジャーナルレコード

\exp1\exp1_in.csv

"日付","番号","個数"
"20100604","A04",1

コマンドの実行例は、“7.3 別のマスタで続けて連結する例”を参照してください。

3.3.2.9 結合できなかったデータもすべて出力する場合

連結条件に一致するデータが入力マスタファイルに存在しない場合、かつ入力マスタファイルのデータが入力ジャーナルファイルのデータに存在しない場合でも、すべてのデータを出力するときは、FULL OUTER JOIN方式で連結します。この場合、連結条件式の結合型に“FULL OUTER”を指定します。

商品番号と個数が記述された入力ジャーナルファイルと、商品番号に対する単価が記述された入力マスタファイルを連結し、商品についての小計(単価×個数)を計算します。

入力ジャーナルファイル

"日付","番号","個数"
"20100603","A03",3
"20100603","A01",24
"20100604","A04",1
"20100605","A01",60

入力マスタファイル1

"コード","商品名","価格"
"A01","鉛筆","60"
"A02","赤鉛筆","100"
"A03","消しゴム","80"

入力マスタファイル2

"ID","在庫"
"A01","7000"
"A02","1000"
"A03","2500"
"A05","100"

連結条件

入力項目定義
(ListDef)
 {
  document(Journal){
    $J日付          日付,
    $J番号          番号,
    $J個数          個数
    },
  document(Master1){
    $Mコード        コード,
    $M商品名        商品名,
    $M価格          価格
    },
  document(Master2){
    $Mid           ID,
    $M在庫         在庫
    }
}
連結条件式  
(Jcondition)
{  join (Journal,Master1,$J番号 == $Mコード, "FULL OUTER"),
   join (Journal,Master2,$J番号 == $Mid,   "FULL OUTER") }
リターン式
(OutputDef)
 {$J日付 日付, $M商品名 商品名, $M価格 単価, $J個数 個数, val($M価格) * val($J個数) 小計, $M在庫 在庫}

連結結果

"日付","商品名","単価","個数","小計","在庫"
"20100603","消しゴム","80","3",240,"2500"
"20100603","鉛筆","60","24",1440,"7000"
"20100604",,,"1",,                            ・・・(注1)
"20100605","鉛筆","60","60",3600,"7000"
,"赤鉛筆","100",,,                            ・・・(注2)
,,,,,"1000"                                   ・・・(注3)
,,,,,"100"                                    ・・・(注3)

注1) 未連結のジャーナルレコードをリターン式に合わせて出力しています。
注2) 入力マスタファイル1の未連結のマスタレコードを、リターン式に合わせて出力しています。
注3) 入力マスタファイル2の未連結のマスタレコードをリターン式に合わせて出力しています。