2015年6月22日月曜日

正規表現の利用

2015-06-22発信

正規表現 (Regular Expressions) というものをご存じでしょうか。

簡単に言えば、正規表現は文字列のパターンを定義した文字列式です。
多くのプログラミング言語が正規表現をサポートしており、これを使うことにより、ある文字列が一定のパターンに一致するかどうかを判定したり、パターン内のグループごとに分割したりすることができます。

FMEでもいくつかのトランスフォーマーで正規表現が利用でき、それらによってデータ変換・統合における課題が簡単に解決できるケースがあります。
以下の例は全て、これまでに実際に私が出会ったことがあるものです。

例1: 都道府県別の統計表
都道府県名の前後や中間に空白が含まれる(「 千  葉  県  」、「 東  京 都 」など)。
都道府県名をキーとして他のテーブルと結合するために、全ての空白を削除しなければならない。

例2: 現地調査結果の表
調査地点の緯度経度が単位を含んだ60進数表現で記述されている(「35度51分56.1秒」、「139度58分25.2秒」など)。
緯度経度に基づいてポイントジオメトリを作成するために、度単位の数値に変換しなければならない。

例3: 会員名簿
生年月日がまちまちな書式の文字列(日付型データではない)で記述されている(「昭和45年12月5日」、「H3.3.10」、「1986/6/25」など)。
データベースに移行するために、和暦年は西暦年に換算したうえで書式を統一しなければならない

FMEでこれらの課題を解決するのには、正規表現が利用できるトランスフォーマー(StringReplacer, StringSearcher)を使った次のようなアプローチが考えられます。

例1: StringReplacerで都道府県名文字列内で「空白類文字」に一致する文字を全て「空文字列」に置き換える。
例2: StringSearcherで緯度、経度文字列から度、分、秒の数値部分を抽出した後、それらを度単位の値に換算する。
例3: これは数段階の処理になります。
(1) StringSearcherで昭和のパターンに一致するものを選択し、年、月、日の値を抽出する。
(2) 昭和に一致しなかったものについて、StringSearhcer(2) で平成のパターンに一致するものを選択し、年、月、日の値を抽出する。
(3) 平成に一致しなかったものについて、StringSearcher(3) で西暦のパターンに一致するものを選択し、年、月、日の値を抽出する。
(4) 昭和・平成の年を西暦年に換算したうえで、データベース移行用の書式に整える。

Excelの関数を使い、あらかじめ望ましい書式に変換した列を元の表に追加しておくこともできますが、これらのトランスフォーマーで正規表現を利用する利点としては次のようなことが挙げられます。
1. 元の表に列を追加した中間データファイルを作成・管理する必要がない。
2. 書式の変換と本体のデータ変換(テーブル結合、ポイントジオメトリ作成、データベースへの移行)をひとつのデータフローで行える。
3. StringSearcherでは想定される書式と一致しないデータの検出も容易にできる。

Excelで書式を変換するよりもはるかに早く、正確にデータ変換・統合ができますし、元のデータに修正があった場合の対応も楽になります。
例示したものと似たような課題に遭遇したときは、正規表現の利用についてもご検討ください。

0 件のコメント:

コメントを投稿