ページのトップに戻る
Interstage Data Effector ユーザーズガイド

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

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

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

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

コマンド利用時は、replace用動作環境ファイルのJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。
C API利用時は、AsisInitReplace関数のJnlFileパラメタとMstFileパラメタに、スキーマ情報ファイルを指定します。

参照

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

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


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

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


入力ジャーナルファイル

"日付","作業内容","対象店"
"20070528","空調点検","[品川店]"
"20070529","空調点検","[横浜店][川崎店]"
"20070530","空調点検","[新横浜店]"

入力マスタファイル

"店舗名","担当者"
"品川店","佐藤"
"川崎店","山田"
"横浜店","鈴木"
"新横浜店","田中"

連結条件

連結条件式  
リターン式    
{join (Jnl,Mst,$対象店 = "[" + $店舗名+ "]", "LEFT") }
{ $日付, $店舗名, $担当者, $作業内容 }

連結結果

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

参考

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


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

入力ジャーナルファイルの繰返しノードを1レコードとしてファイルに出力できます。出力単位ノードをパス式でJnodeパラメタ(出力単位ノード)に指定します。
例として、/Jnl/Body/Meisaiノードが1レコード中に繰り返し記述されており、/Jnl/Body/Meisaiノード単位に連結結果を出力することを想定します。

入力ジャーナルファイル


入力マスタファイル

連結条件ファイルのJnodeパラメタに出力単位ノードを指定します。


連結条件ファイル

InFileType    XML
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()
             }
}
Jnode         /Jnl/Body/Meisai
OutFileType   CSV
#リターン式
OutputDef     {$Kbn,$Kname,$Number,$Nname,$Code,$Name,$Val}
#連結条件式
Jcondition    {join (Journal, Master1, $Kbn == $Kcode, "LEFT"),
               join (Journal, Master2, $Number == $Ncode, "LEFT")
}

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


連結コマンドの出力例


3.3.2.4 連結結果を演算する場合

入力ジャーナルファイルのレコードと入力マスタファイルのレコードを連結した結果に対して、数値演算を行うことができます。
数値演算を行う場合、リターン式に数値演算式を指定します。
また、数値演算式を指定した場合の空の扱いについて注意する必要があります。詳細は、“A.3.2 数値演算式における空の扱い”を参照してください。


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


入力ジャーナルファイル

"日付","商品No","個数"
"20070603","A03",3
"20070603","A01",24
"20070604","A04",1
"20070605","A01",60

入力マスタファイル

"商品コード","商品名","単価"
"A01","鉛筆","60"
"A02","赤鉛筆","100"
"A03","消しゴム","80"
"A04","定規","150"

連結条件

連結条件式  
リターン式    
{ join (Jnl,Mst, $商品No == $商品コード , "LEFT") }
{ $日付, $商品名, $単価, $個数, val($単価) * val($個数) 小計 }

連結結果

"日付","商品名","単価","個数","小計"
"20070603","消しゴム","80","3",240
"20070603","鉛筆","60","24",1440
"20070604","定規","150","1",150
"20070605","鉛筆","60","60",3600

3.3.2.5 データ行だけを出力する場合

Data Effectorの処理結果をデータベースに格納する場合など、見出し行(項目名)が不要なときがあります。このようなデータ行だけの出力もData Effectorで指定できます。

コマンド利用時は、replace用動作環境ファイルのOutFileパラメタに、スキーマ情報ファイルとデータファイルを別々に指定します。
C API利用時は、AsisInitReplace関数のOutFileパラメタに、スキーマ情報ファイルとデータファイルを別々に指定します。


以下に、コマンド利用時、replace用動作環境ファイルのOutFileパラメタに指定した例を示します。

WindowsWindowsの場合

OutFile    "D:¥Shunsaku¥outdata¥kekka_header.csv;D:¥Shunsaku¥outdata¥kekka_data.csv"

SolarisLinuxLinux/Solarisの場合

OutFile   /home/shunskau/outdata/kekka_header.csv;/home/shunsaku/outdata/kekka_data.csv

出力ファイルの例

kekka_header.csv(スキーマ情報ファイルだけの例)

"日付","商品名","単価","個数","小計"

kekka_data.csv(データファイルだけの例)

"20070603","消しゴム","80","3",240
"20070603","鉛筆","60","24",1440
"20070604","定規","150","1",150
"20070605","鉛筆","60","60",3600

参照

指定書式の詳細については、以下を参照してください。


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

Data Effectorの連結機能の結合方法には、以下の2つがあります。

INNER JOIN方式

入力ジャーナルファイルのデータが、入力マスタファイルに存在しない場合、そのデータを出力しない。

LEFT OUTER JOIN方式

入力ジャーナルファイルのデータが、入力マスタファイルに存在しない場合、そのデータは空で出力する。

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

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

参照

連結条件式の詳細については、“A.6 連結条件式”を参照してください。

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


入力ジャーナルファイル

"日付","商品No","個数"
"20070603","A03",3
"20070603","A01",24
"20070604","A04",1
"20070605","A01",60

入力マスタファイル

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

連結条件

連結条件式  
リターン式    
{ join (Jnl, Mst, $商品No == $商品コード ,"INNER") }
{ $日付, $商品名, $単価, $個数, val($単価) * val($個数) 小計 }

連結結果

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

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

参考

同じデータをLEFT OUTER JOIN方式で連結した場合、以下の結果になります。

連結条件
連結条件式  
リターン式    
{ join (Jnl, Mst, $商品No == $商品コード ,"LEFT" ) }
{ $日付, $商品名, $単価, $個数, val($単価) * val($個数) 小計 }

連結結果
"日付","商品名","単価","個数","小計"
"20070603","消しゴム","80","3",240
"20070603","鉛筆","60","24",1440
"20070604",,,"1",
"20070605","鉛筆","60","60",3600

3.3.2.7 データの後方空白を取り除く場合

例えば、データベースから抽出されたデータには、各カラムの文字数にあわせ、データの後ろに空白文字が含まれることがあります。

このような、桁あわせのために付加されたデータの後方空白を取り除く場合、連結条件式またはリターン式にrtrim関数を指定します。

入力ジャーナルファイル

"日付","商品No","個数"
"20070603","A03△△",3
"20070603","A01△△",24
"20070604","A04△△",1
"20070605","A01△△",60

△は、空白文字を表します。

入力マスタファイル

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

連結条件

連結条件式  
リターン式    
{ join (Jnl, Mst, rtrim($商品No) == $商品コード ,"INNER") }
{ $日付, $商品名, $単価, $個数, val($単価) * val($個数) 小計 }

連結結果

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

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

参照

rtrim関数の指定方法の詳細については、“A.8.2 rtrim関数”を参照してください。


3.3.2.8 連結機能を使った応用例

連結機能では、XML形式の入力ジャーナルファイルを、CSV形式に変換できます。その場合、連結条件のJconditionパラメタは不要です。


入力ジャーナルファイル

<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>

連結条件

# 入力ファイルタイプ
InFileType   XML
# 出力ファイルタイプ
OutFileType  CSV
# 入力項目定義
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()
             }
}
# リターン式
OutputDef  {$Kbn,$Number,$Code,$Name,$Val}
# 連結条件式Jcondition  なし
# 数値演算式における空の扱い
SubstituteZeroForEmpty        NO

連結結果

"Kbn","Number","Code","Name","Val"
"01","1000","AAA","ブロックA","1000"
... 

注意

XML形式をCSV形式に変換する場合、実体参照などの置換に注意する必要があります。詳細については、以下を参照してください。