ページの先頭行へ戻る
Interstage Data Effector 導入・運用ガイド
Interstage

3.1.5 いろいろなデータ抽出方法

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

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

データベースのエクスポート機能などを使って抜き出したCSV形式のファイルには、見出し行(項目名)が付加されていない場合があります。このようなデータだけのファイルも、そのままData Effectorで抽出できます。
見出し行だけのファイルをスキーマ情報ファイルとして別に定義しておけば、データファイルと合わせて処理します。


1つのスキーマ情報ファイルと、3つのCSV形式のデータファイルを入力ファイルとして定義します。

WindowsWindowsの場合

SchemaFile  "D:\Shunsaku\schema\schema.csv"
DataFile    "D:\Shunsaku\indata\data001.csv"
DataFile    "D:\Shunsaku\indata\data002.csv"
DataFile    "D:\Shunsaku\indata\data003.csv"

SolarisLinuxLinux/Solarisの場合

SchemaFile  /home/shunsaku/schema/schema.csv
DataFile    /home/shunsaku/data/data1.csv
DataFile    /home/shunsaku/data/data2.csv
DataFile    /home/shunsaku/data/data3.csv

shunselectコマンド利用時は、入力定義ファイルにスキーマ情報ファイルを指定します。
C API利用時は、AsisSetSchemaSelect関数にスキーマ情報ファイルを指定します。

統合コマンド利用時は、付録F 統合定義ファイルの処理条件定義部:SelectのDataFileタグにSchemaFile属性を指定します。


参照

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

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


3.1.5.2 抽出結果を既存ファイルに追記する場合

抽出結果を書き出す出力ファイルがすでに存在する場合、出力時の処理モードを以下から選択できます。

shunselectコマンド利用時は、出力定義ファイルに指定します。
C API利用時は、AsisAddQuerySelect関数のWModeパラメタに指定します。
統合定義ファイル利用時は、統合定義ファイルOutFileタグのAppend属性に指定します。


shunselectコマンド利用時、出力定義ファイルを指定した例を以下に示します。

検索番号1の結果を、kekka1.xmlに上書きします。
検索番号2の結果を、kekka2.xmlに上書きします。
検索番号3の結果を、kekka3.xmlに追記します。
検索番号4の結果を、kekka4.xmlに追記します。


WindowsWindowsの場合

1> D:\Shunsaku\outdata\kekka1.xml
2> D:\Shunsaku\outdata\kekka2.xml
3>> D:\Shunsaku\outdata\kekka3.xml
4>> D:\Shunsaku\outdata\kekka4.xml

SolarisLinuxLinux/Solarisの場合

1> /home/shunsaku/outdata/kekka1.xml
2> /home/shunsaku/outdata/kekka2.xml
3>> /home/shunsaku/outdata/kekka3.xml
4>> /home/shunsaku/outdata/kekka4.xml

参照

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


注意

上書きを選択した場合、既存データを消去してしまうので注意してください。


3.1.5.3 抽出結果の項目を指定する場合

抽出条件に一致した項目の中から、出力したい項目だけを指定できます。
shunselectコマンド利用時は、検索定義ファイルにリターン式を指定します。
C API利用時は、AsisAddQuerySelect関数のReturnパラメタにリターン式を指定します。
統合コマンド利用時は、統合定義ファイルの処理条件定義部:SelectのRConditionタグにリターン式を指定します。

例として以下の文書があるものとします。


文書A

"empno","name","date","expense","area","train","taxi"
"19980120","鈴木太郎","2007年06月30日","15700円","東京都千代田区","7200円",""
  :

文書B

"empno","name","date","expense","area","train","taxi"
"20012111","佐藤花子","2007年07月01日","16020円","大阪府大阪市阿倍野区","14200円","1820円"
  :

文書C

"empno","name","date","expense","area","train","taxi"
"19980120","鈴木太郎","2007年07月02日","2400円","神奈川県横浜市港北区","2400円",""
  :

文書D

<doc>
 <ID>1234567</ID>
 <Name>FujitsuTaro</Name>
 <Birthday>19700310</Birthday>
 <Career>
  <License>
   <Name>情報処理
    <Kind>2種</Kind>
   </Name>
   <Date>20020101</Date>
  </License>
  <License>
   <Name>英語検定
    <Kind>1級</Kind>
   </Name>
   <Date>20030901</Date>
  </License>
 </Career>
</doc>

以下に、検索定義ファイルにリターン式を指定した例を示します。

交通費(expense)が10000円より安い(小さい)人の従業員番号(empno)および出張日(date)を、1つのファイルに抽出します。

検索式 
{$empno,$date}   $expense < 10000

結果:

"empno","date"
"19980120","2007年07月02日"

氏名(Name)がFujitsu Taroの、氏名(Name)と資格(License)を、1つのファイルに抽出します。

検索式
{/doc/Name,/doc/Career/License/Name}   /doc/Name = 'Fujitsu Taro'

結果:

<doc>
 <Name>FujitsuTaro</Name>
 <Career>
  <License>
   <Name>情報処理
    <Kind>2種</Kind>
   </Name>
  </License>
  <License>
   <Name>英語検定
    <Kind>1級</Kind>
   </Name>
  </License>
 </Career>
</doc>

参照

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


3.1.5.4 項目同士を比較する場合

項目同士を比較して条件にあったデータを抽出する場合は、項目間比較機能を使います。

例として以下の文書があるものとします。


文書A

氏名

年齢

性別

昨年の身長

昨年の体重

身長

体重

胴回り

座高

鈴木太郎

30

171.5

70.4

172.3

69.8

78.1

89.2

鈴木一郎

28

176.2

85.6

177.1

87.1

92.3

95.4

佐藤花子

24

150.9

49.1

150.8

50.5

82.9

84.2

鈴木巧

41

165.8

61.1

165.1

60.2

80.1

90.8

田中愛子

36

162.3

45.1

162.8

44.2

67.8

85.1

昨年よりも体重が増加して、かつ胴回りが80cmより多い肥満傾向の従業員を検索します。

検索式
val($昨年の体重)  <  val($体重)   AND   val($胴回り)  >  80.0

結果:

氏名

年齢

性別

昨年の身長

昨年の体重

身長

体重

胴回り

座高

鈴木一郎

28

176.2

85.6

177.1

87.1

92.3

95.4

佐藤花子

24

150.9

49.1

150.8

50.5

82.9

84.2


参照

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

3.1.5.5 XML形式の繰返し項目を抽出する場合

XML形式の場合、同じ名前の要素ノードが複数、繰り返して含まれることがあります。
検索式でフィルタ式を使うことにより、繰返しの各要素に対する条件判定ができます。

例として以下の文書があるものとします。


1

2009年6月11日の伝票の日付<date>とオーダ番号<order_no>を抽出します。
出力結果は、条件を満たす繰返し項目だけを出力します。

文書A

1つめのレコードに繰返し項目があり、3つのレコードがあるXML文書例です。

<root>                                              ・・・1番目のレコード
  <jigyosho>kanto</jigyosho>
  <denpyo>                                          ・・・1番目の繰返し項目
    <date>2009/06/11</date>    <note>xxx</note>   
    <order_no>A-00105</order_no>
  </denpyo>
  <denpyo>                                          ・・・2番目の繰返し項目
    <date>2009/06/15</date>    <note>xxx</note>   
    <order_no>A-00109</order_no>
  </denpyo>
</root>
<root>                                              ・・・2番目のレコード
  <jigyosho>chubu</jigyosho>
  <denpyo>
    <date>2009/06/11</date>    <note>xxx</note>   
    <order_no>A-00211</order_no>
  </denpyo>
</root>
<root>                                              ・・・3番目のレコード
  <jigyosho>kansai</jigyosho>
  <denpyo>
    <date>2009/06/12</date>    <note>xxx</note>   
    <order_no>A-00107</order_no>
  </denpyo>
</root>

抽出条件

検索式
$x := /root/denpyo{ /date == '2009/06/11' }
リターン式
$x/date, $x/order_no

結果:

<root>
  <denpyo>
    <date>2009/06/11</date>    <order_no>A-00105</order_no>
  </denpyo>
</root>
<root>
  <denpyo>
    <date>2009/06/11</date>    <order_no>A-00211</order_no>
  </denpyo>
</root>

ポイント

  • 上記例の検索式の“x”は、バインド変数名です。バインド変数名とは、フィルタ式によって選択されたノードの集まりに名前を付けたものです。

  • 名前は、フィルタパスで表される要素ノードの中でフィルタ式に指定された条件を満たすものの集まりに関連付けられます。リターン式でその名前を使用することで、フィルタ式の条件を満たすノードだけを出力できます。

  • 上記例のように、「denpyo」要素が複数ある場合でも、フィルタ式の条件を満たすノードだけが出力されます。

  • 検索式の条件を満たさないレコード(上記例の場合、3番目のレコード)に関するデータは、何も出力されません。


2

条件を満たす繰返し項目の、親や兄弟要素を出力することもできます。
タイプがBである項目と、その項目を含む伝票の日付を出力します。

文書A

1つめのレコードに繰返し項目があり、3つのレコードがあるXML文書例です。

<root>
  <denpyo>
    <date>2009/06/11</date>
    <item type="A">value1</item>
    <item type="B">value2</item>
  </denpyo>
  <denpyo>
    <date>2009/06/11</date>
    <item type="C">value5</item>
    <item type="D">value6</item>
  </denpyo> 
</root>

抽出条件

検索式
$x := /root/denpyo{ $y := /item{ /@type = 'B' } }
リターン式
$x/date, $y

結果:

<root>
  <denpyo>
    <date>2009/06/11</date>
    <item type="B">value2</item>
  </denpyo>
</root

ポイント

  • リターン式で指定するバインド変数参照では、バインド変数が示す要素の配下(子供、子孫)の要素だけ指定できます。そのため、以下のような指定をすることはできません。

    検索式
    /root/denpyo{ $y := /item{ /@type = ‘B’} }
    リターン式
    $y/../date, $y
  • 繰返し項目の親や兄弟の要素を出力するためには、条件を表す要素(item)と出力したい要素(date)の共通の祖先の中で最も近い祖先の要素(denpyo)に名前($x)を付ける必要があります。

  • 繰返し項目の親や兄弟の要素は、共通の祖先からの相対パスで指定します。

  • $xは、タイプが“B”である項目を持つ伝票に制限されているので、2番目のレコードは出力されません。


参照

フィルタ式の指定書式の詳細については、“A.2.9 フィルタ式”を参照してください。


3.1.5.6 繰返し項目が2階層になっているデータを抽出する場合

XML形式の繰返し項目が階層になっている場合、フィルタ式の階層表記を使うことにより、データを抽出できます。


文書A

<root>
  <denpyo>
    <date>2009/06/11</date>
    <item type="A">value1</item>    <item type="B">value2</item>
  </denpyo>
  <denpyo>
    <date>2009/06/15</date>
    <item type="A">value3</item>    <item type="B">value4</item>
  </denpyo>
  <denpyo>
    <date>2009/06/11</date>
    <item type="C">value5</item>    <item type="D">value6</item>
  </denpyo> 
</root>

日付が2009年6月11日である伝票と、各伝票の中でタイプがBである項目だけを選んで出力します。

検索式
$x := /root/denpyo{ /date == '2009/06/11' AND $y := /item{ /@type = 'B'} }
リターン式
$x/date, $y

結果:

<root>
  <denpyo>
    <date>2009/06/11</date>
    <item type="B">value2</item>
  </denpyo>
</root>

ポイント

内側のバインド変数「$y」に関連付けられているノードは、外側のフィルタ式の条件(日付が6月11日である)を満たす伝票の中のものだけです。
そのため、2番目のレコードの伝票は、タイプ(type)が「B」である項目が存在しますが、日付(date)が6月11日でないため、出力されません。
3番目のレコードの伝票は、タイプ(type)が「B」である項目が存在せず、「$x」の条件を満たさないため、出力されません。


参照

フィルタ式の指定書式の詳細については、“A.2.9 フィルタ式”を参照してください。