2015-07-08

属性値の条件に基づくデータ抽出

データ抽出にはふたつの意味合いがあります。ひとつは、ある条件に該当するフィーチャー(行、レコード)を選択すること、もうひとつは必要な属性(列、フィールド)を選択することです。後者は属性名の変更や新たな属性の追加などとあわせてスキーマ変更の範疇としてとらえることもできます。
属性値の条件に基づいてフィーチャーを選択することによるデータ抽出の事例として、さまざまな地域区分の集計行が混在している表から市区町村別の集計行と都道府県別の集計行を抽出し、それぞれ個別の表を作成するワークスペースの例を掲げます。
また、記事の末尾には、トランスフォーマーのパラメーター設定において条件判定を行う場合に使用できる比較演算子の一覧表を掲げます。
FME 2015.1.0.3 build 15485

=====
平成22年国勢調査人口等基本集計(全国結果)の人口等集計表から市区町村別、都道府県別の集計行を抽出し、それぞれについて、次の列で構成される表(CSV形式)を作成する。
1. H22市区町村人口:
都道府県コード, 市区町村コード, 都道府県名, 市区町村名, H22人口, H17組替人口, 面積km2
2. H22都道府県人口:
都道府県コード, 都道府県名, H22人口, H17組替人口, 面積km2

ソースデータ
e-Stat 政府統計の総合窓口からダウンロードした平成22年国勢調査「人口,人口増減,面積及び人口密度」テーブル(CSV 形式, 全国1ファイル)
e-Stat 政府統計の総合窓口
平成22年国勢調査 > 人口等基本集計(男女・年齢・配偶関係,世帯の構成,住居の状態など)> 全国結果
総人口・総世帯数 表番号1 人口,人口増減,面積及び人口密度
ダウンロードファイル名: 001.csv

各行の「地域識別コード」列の値により、その行が集計対象としている地域区分が識別できる。
a: 全国・都道府県
b: 市部・郡部
c: 支庁・振興局・郡
d: 人口集中地区
0: 区
1: 政令指定都市・東京都区部
2: 政令指定市以外の市
3: 町村
9: 平成12年(2000年)現在の市区町村
=====

FMEワークスペース例




















[CSV] リーダー: ソースデータからデータ行を読み込む。
ソースデータでは、先頭1~9行目に表のタイトルや注記など、10行目に列名が記述されており、データ行は11行目から始まっています。そのため、CSVリーダーをワークスペースに追加する際に次のようにパラメーターを設定することにより、10行目を属性名とし、11行目から読み込むようにしました。
なお、10行目(列名行)の左から7列目(地域名が記述されている列)は空欄であるため、その列にはデフォルトの属性名 "col6" ("col" と左端の列を 0 とする列番号を連結した名前) が自動的に与えられます。

CSV リーダーパラメーター(ワークスペースにリーダーを追加する時に設定)
- Feature Type Name(s): Feature Type from File Name(s) (ファイル名をフィーチャータイプ名とする)
- File Has Field Names: チェック(ファイルは列名行を持っている)
- Field Names Follow Header: チェック(列名はヘッダ部分の最後の行に記述されている)
- Lines to Skip / Header: 10 (先頭の10行をスキップする)
















AttributeRenamer: 属性名を変更する(変更後: H22人口、H17組替人口、面積km2)。
SubstringExtractor: 地域コードの先頭2文字を抽出して「都道府県コード」属性を作成する。
TestFilter: 地域識別コードの値に応じて市区町村別集計行、都道府県別集計行、その他の行に振り分ける。

AttributeRenamer_2: 市区町村別集計行の属性名を変更する(変更後: 市区町村名、市区町村コード)。
AttributeRenamer_3: 都道府県別集計行の属性名を変更する(変更後: 都道府県名)。
FeatureMerger: 都道府県コードをキーとして、都道府県集計行の属性を市区町村別集計行に結合する。
これは、「都道府県名」を市区町村別集計行に与えるためのものです。 Requestor フィーチャーと Supplier フィーチャーが同じ名前の属性を持っていた場合、デフォルトでは Requestor フィーチャーの方の属性が残されるので、都道府県名以外の属性は結合されません。名前が同じ属性の扱い方は "Attribute Accumulation" グループのパラメーターによって変更することもできます。

[CSV] ライター: 市区町村別集計行、都道府県別集計行をそれぞれのファイルに出力する。
CSV形式の場合、出力先データセットはフォルダー、フィーチャータイプはファイルに対応します。ひとつのCSVライター(ひとつのデータセット)について2つのフィーチャータイプを作成し、ひとつを FeatureMerger の Merged ポート、もうひとつを AttributeRenamer_3 に接続することにより、同一のフォルダに各表のファイルが出力されます。

このワークスペースでは TestFilter を使い、
- 地域識別コードが "0", "2" または "3" のフィーチャーを「市区町村」ポート
- 地域識別コードが "a" であり、かつ、地域コードが "00000" (全国)でないフィーチャーを「都道府県」ポート
- その他を <Unfiltered> ポート
に振り分けることによって、フィーチャー選択によるデータ抽出を行っています。

これによってデータフローが分岐することになりますが、「データフローの分岐 - 異なる形式の複数のデータセット作成」で取り上げたリーダーフィーチャータイプやトランスフォーマーの出力ポート直後でのデータフローの分岐(分岐の数だけフィーチャーがコピーされる)と明瞭に区別するため、ここでは、トランスフォーマーによって何らかの条件判定を行い、その結果に基づいてフィーチャーを複数のデータフローに振り分けることを「条件分岐」と呼ぶことにします。

TestFilter パラメーター設定
Test Condition 欄をダブルクリック、または選択して Edit ボタンをクリックすることにより、各出力ポート (Output Port) に対応する条件式の編集画面が開きます。出力ポート(条件式)は必要に応じていくつでも追加できます。

















この例のように属性の値に応じてデータフローを3方向以上に条件分岐させる場合は TestFilter が適当ですが、2方向の場合は Tester が良く使われます。その他、属性値だけでなく、ジオメトリの空間的な関係も含めてさまざまな条件によってデータフローの条件分岐を行うための多数のトランスフォーマーが用意されています。
データフローの条件分岐を行うためのトランスフォーマーは、 Transformer Gallery の Categorized/Filters フォルダに分類されています。

結果: 「H22市区町村人口」表 (FME Data Inspector の Table View による表示)















結果: 「H22都道府県人口」表 (FME Data Inspector の Table View による表示)















FME Workbench メニュー: Writers > Redirect to FME Data Inspector を選択(チェック)した状態でワークスペースを実行すると、ライターフィーチャータイプへの出力はファイルではなく Data Inspector に送られ、上の図のように実行結果を確認することができます。

ソースデータがデータベーステーブルである場合は、データベースを良く使っている方ならSQLクエリによって各表を簡単に作成できると思います。FMEでは、ソースデータがデータベーステーブルでなくても InlineQuerier を使うとSQLクエリによって結果テーブルを取得することができるので、データベース利用のスキルを生かすこともできます。InlineQuerier については「属性結合の基本的な方法」でも取り上げていますので、そちらも参照してください。

FMEワークスペース例 - InlineQuerier
















SQL文の例: H22市区町村人口テーブル作成用
-----
select
a.pcode as [都道府県コード],
a.[地域コード] as [市区町村コード],
b.col6 as [都道府県名],
a.col6 as [市区町村名],
a.[人口 平成22年 (a)] as [H22人口],
a.[人口 平成17年(組替) 2)] as [H17組替人口],
a.[面積(km2) (b) 1)2)] as [面積km2]
from (select substr([地域コード],1,2) as pcode,*
    from Source where [地域識別コード] in ('0','2','3')) as a
inner join (select substr([地域コード],1,2) as pcode, col6
    from Source where [地域識別コード] = 'a') as b
on b.pcode = a.pcode order by a.[地域コード]
-----

SQL文の例: H22都道府県人口テーブル作成用
-----
select
substr([地域コード],1,2) as [都道府県コード],
col6 as [都道府県名],
[人口 平成22年 (a)] as [H22人口],
[人口 平成17年(組替) 2)] as [H17組替人口],
[面積(km2) (b) 1)2)] as [面積km2]
from Source where [地域識別コード] = 'a' and [地域コード] <> '00000'
order by [地域コード]
-----

==========
条件判定用の比較演算子
条件判定を行うことができる全てのトランスフォーマーのパラメーター設定における Test Clauses (条件判定句) では、次の表に掲げる演算子 (Operator) が共通で使用できます。

演算子 「真 (true)」の条件 備考
= 左辺と右辺が等しい。
!= 左辺と右辺が等しくない。
< 左辺が右辺より小さい。
> 左辺が右辺より大きい。
<= 左辺が右辺と等しい, または, 右辺より小さい。
>= 左辺が右辺と等しい, または, 右辺より大きい。
In 左辺が右辺に列挙された値のどれかひとつと一致する, または, 右辺に指定された2つの値の範囲内 (下限値, 上限値を含む) である。 右辺にはカンマ区切りで値を列挙, または, ハイフンによって範囲を指定する。
例1: 1,2,3
例2: 1-3
注: ハイフンを含む文字列を列挙するときは二重引用符で囲む。例: "LL-27","LL-83"
Between 左辺が右辺に指定された2つの値の範囲内 (下限値, 上限値を含む) である。 右辺には下限値と上限値をカンマ区切り, または, ハイフン区切りで指定する。
例1: 1,5
例2: 1-5
Like 左辺の文字列が右辺のワイルドカード % を含む文字列と一致する。 ワイルドカード % は 0 個以上の任意の文字からなる文字列を意味する。
例 (bc を含む文字列が一致する): %bc%
Numeric モードでは使用できない。
Matches Regex 左辺の文字列が右辺の正規表現 (Regular Expression) と一致する。 例 (bc を含む文字列が一致する): .*bc.*
Numeric モードでは使用できない。
Contains 左辺の文字列が右辺の文字列を含む。 Numeric モードでは使用できない。
Begins With 左辺の文字列が右辺の文字列から始まる。 Numeric モードでは使用できない。
Ends With 左辺の文字列が右辺の文字列で終わる。 Numeric モードでは使用できない。
Attribute Is Null 左辺に指定した属性の値が null である。 右辺は使用しない。
Numeric モードでは使用できない。
Attribute Is Empty String 左辺に指定した属性の値が空文字列である。 右辺は使用しない。
Numeric モードでは使用できない。
Attribute Is Missing 左辺に指定した属性が存在しない。 右辺は使用しない。
Numeric モードでは使用できない。
注1: =, !=, <, >, <=, >= 演算子の左辺または右辺に指定した属性の値が null である場合、またはその属性が存在しない (missing) 場合、その値は空文字列 (empty string) として扱われます。
注2: String モードのとき、<, >, <=, >= 演算子は選択できません。Automatic または Numeric モードでこれらの演算子を使用したときに、左辺または右辺のどちらか一方でも数値として解釈できない文字列である場合は、辞書順によって比較されます。










Negate (否定)
Negate チェックボックスをチェックすると条件判定結果(真、偽)が逆転します。
例えば属性 "X" が 1 を格納していた場合、条件判定句 "X = 1" は、Negate をチェックしていないとき (デフォルト) は真、チェックしたときは偽と判定されます。

Mode (モード)
Automatic (自動): 左辺、右辺が両方とも数値または数値として解釈できる文字列である場合は数値として比較され、どちらか一方でも数値として解釈できない文字列である場合は文字列として比較されます。
String (文字列): 常に文字列として比較されます。
Numeric (数値): Automatic と同じです。
例えば条件判定句 "4E5 = 400000" は、Automatic, Numeric モードでは真、String モードでは偽と判定されます。"4E5"は 4×10を意味する数値表現です。

0 件のコメント:

コメントを投稿