Q&A 文字列の連結

Q: 都道府県名、郡名、政令指定都市名、市区町村名をそれぞれ個別の属性として持つフィーチャーで構成されるデータセットがあります(下表の例参照)。フィーチャーごとにこれらをスペース区切りで連結した文字列を作成し、新たな属性として追加するにはどのような方法がありますか。

都道府県指定都市市区町村作成したい文字列
北海道
札幌市中央区北海道 札幌市 中央区
東京都

千代田区東京都 千代田区
三重県

津市三重県 津市
沖縄県八重山郡
与那国町沖縄県 八重山郡 与那国町

FME 2019.2

A: StringConcatenator(または AttributeCreator や AttributeManager)によって都道府県名等の属性値とスペースを交互に連結した文字列を作成して新たな属性に格納した後、StringReplacer によってその文字列中で2個以上のスペースが連続している部分を単一のスペースに変換できます。

あるいは、AttributeCreator(または AttributeManager)で都道府県名等を要素とするリスト属性を作成し、値のある要素だけを ListConcatenator によってスペース区切りで連結することもできます。


StringCocatenator + StringReplacer

StringConcatenator

都道府県名、郡名、政令指定都市名、市区町村名を格納している属性名が KEN、GUN、SEIREI、SIKUCHOSON である場合、次の図のように StringConcatenator(Basic Mode)の String Parts リストでそれらの属性とスペース1個(画面上では見えません)を交互に設定すると、実行時にそれらを連結した文字列が作成され、New Attribute パラメーターで設定した名前の属性に格納されます。

String Parts リストの String Type 列で、String Value 列に設定する値(連結する文字列)の種類として、Attribute Value(属性値)、Constant(固定値)、New Line(改行文字)などが選択できます。

Concatenated Result(連結結果)フィールドには、String Parts リストで定義した内容に基づいて FME Workbench が自動的に生成した文字列式(String Expression)が表示されます。@Value(属性名) はFME固有の関数で、実行時にはカッコ内に記述されている名前の属性の値に置き換えられます。文字列式は、@Value関数によって実行時に取得する属性値、固定値(この例ではスペース)、ワークスペースのパラメーターなどを単に並べたものですが、実行時にはそれらの値を連結したひとつの文字列に変換されます。


StringConcatenator のパラメーター設定画面には、上の図のような画面 – Basic Mode のほかにもうひとつ、Advanced Mode と呼ばれる画面があります。Basic Mode では文字列式は Concatenated Result フィールドに表示されるだけですが、右下の [Switch to Advanced] ボタンをクリックして次の図のような Advanced Mode に切り替えると、文字列式を直接編集できるようになります。

String Expression(文字列式)セクションの右側の編集画面で、一般のテキストエディターと同様にキー操作によって文字列式を直接編集できるほか、左側のペインに表示されている属性(Feature Attributes)、ワークスペースのパラメーター(Published/Private Parameters)、特殊文字(Special Characters)などをダブルクリック、または右の編集画面上にドラッグすることにより、編集中の文字列式のカーソルがある場所に素早く挿入することもできます。

右下の [Options] ボタンをクリックして表示されるメニューで Switch To Basic を選択すると、Basic Mode に戻ることができます。ただし、Advanced Mode で複雑な文字列式を作成してから戻ると、Basic Mode の機能ではサポートできずに式が壊れることがあるので注意してください。

また、このメニューで Default To Advanced Editor をチェックすると、次回以降は Advanced Mode のパラメーター設定画面が先に開くようになります。Advanced Mode の方が複雑な文字列式の編集がし易いので、慣れてきたら普段から Advanced Mode を使うことをお勧めします。

なお、新たな属性を作成して文字列式で得られた値を格納するには、StringConcatenator の代わりに AttributeCreator や AttributeManager を使うこともできます。AttributeCreator 等で文字列式の編集をするときに使用するテキストエディターの操作方法は、StringConcatenator Advanced Mode のパラメーター設定画面における String Expression セクションと同じです。


StringReplacer

ひとつの区町村で郡名と政令指定都市名の両方が同時に存在することはなく、また、政令指定都市以外の市や東京特別区では郡名も政令指定都市名も存在しないので、上の StringConcatenator による連結後の文字列には、スペースが2個以上連続した部分が生じます。それを1個のスペースに変換するには、StringReplacer が利用できます。

StringReplacer は、入力フィーチャーの属性のうち Attributes パラメーターで指定した属性の値について、Text to Replace パラメーターで指定した文字列または正規表現(Regular Expression)に一致する部分を Replacement Text で指定した文字列に置き換えます。置き換えるべき部分を特定の文字列、正規表現によるパターンのどちらで指定するかは、Mode パラメーターで指定します(Replace Text または Replace Regular Expression)。

次のパラメーター設定例では、入力フィーチャーの”_result”属性の値(文字列)について、正規表現 \s+(1個以上の連続したスペース類)に一致する部分を1個のスペースに置き換えます。画面上では見えませんが、Replacement Text パラメーターにスペースを1個設定してあります。

なお、Windows のインターフェース上では通常、バックスラッシュ \ は半角の¥(円マーク)で表示されるので、適宜読み替えてください。


AttributeCreator + ListConcatenator

AttributeCreator によってリスト属性を作成し、その各要素に都道府県名から市区町村名までの値を割り当てておけば、ListConcatenator によってそれらをスペース区切りで連結した文字列を作成することができます。

AttributeCreator は、パラメーター設定画面の Attributes To Create テーブルの New Attribute 列に設定された名前の属性を作成し、それに Attribute Value 列に設定された値を格納します(入力フィーチャーが同じ名前の属性をすでに持っていた場合、その値を更新します)。また、波カッコ { } で括ったインデクス(0から始まる連番)をつけた名前に値を割り当てることによって、それらを要素とするリスト属性を作成することもできます。

リスト属性とは、同一の名前(リスト名)によって何らかの関連がある複数の値をまとめて格納するための仕組みであり、個々の値(リストの要素)は波カッコ { } で括ったインデクスによって識別されます。

ListConcatenator は、List Attribute パラメーターで選択したリスト属性の全ての要素を Separator Character パラメーターに設定した区切り文字(列)をはさんでインデクス順に連結した文字列を作成し、Destination Attribute パラメーターで設定した名前の属性に格納します。画面上では見えませんが、次のパラメーター設定例では Separator Character パラメーターにスペース1個を設定してあります。

Drop Empty and Null Elements パラメーターによって、空の要素や<null>の要素を無視するか、無視せずに空文字列として連結するかを選択できます。次の設定例のようにこのパラメーターを Yes に設定すると空や<null>の要素は無視されるので、郡名や政令指定都市名がない市区町村についても、連結後の文字列中で区切り文字(スペース)が2個以上連続することはありません。