このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-054: 顧客データ(customer.csv)の住所(address)は、埼玉県、千葉県、東京都、神奈川県のいずれかとなっている。都道府県毎にコード値を作成し、顧客ID、住所とともに10件表示せよ。値は埼玉県を11、千葉県を12、東京都を13、神奈川県を14とすること。
※コード値を格納するフィールド名はprefecture_cdとすること
解答ワークフローは以下のようになります。
今回はコードとなるフィールドを作る問題です。2値化の発展形と考えても良いかもしれません。
今回やっかいなのは、都道府県別にコードを付与するわけですが、都道府県名のフィールドがないことです。そのため、単純にコード表と結合ということができません。
フォーミュラツールを使った方法
まず、フォーミュラツールを使った方法をご紹介します。やり方としてはシンプルで、住所(address)が各都道府県名で始まるのをStartsWith関数で検知し、それぞれのコード値を割り当てる、という方式になります。式としては以下の通りです。
IF StartsWith([address], "埼玉県") THEN
11
ELSEIF StartsWith([address], "千葉県") THEN
12
ELSEIF StartsWith([address], "東京都") THEN
13
ELSEIF StartsWith([address], "神奈川県") THEN
14
ELSE
Null()
ENDIF
実際のフォーミュラツールの設定は以下の通りとなります。フィールド名は「prefecture_cd」、データ型はByte型としています。
これで完了ですので、あとは不要なフィールドをセレクトツールで削除して、サンプリングツールなどで最初から10レコード抽出すれば完成です。
ただ、今回は1都3県で数が少ないためIF文を書くのもそれほど苦痛ではないと思いますが、全国となるとあまりこの方法はお勧めできません。
検索置換ツールを使った方法
次に、検索置換ツールを使ってみましょう。
まず、最初に手動で都道府県名とコード値の対応表を作ります。正直な話、インターネットを検索するとこのようなコード表と都道府県の対応表みたいなのは簡単に入手可能です。今回は4県程度なので手動で作っても問題ありません。
この表をテキスト入力ツールでワークフローに入れ込むか、もしくはExcelなどで作成し、ExcelファイルやCSV形式で保存しておいて、これを読み込む形でも問題はありません。
こちらはテキスト入力ツールで作成した場合です。
さて、いよいよ検索置換ツールを使います。F入力にcustomer.csvからのデータ、R入力に対応表を入力します。
検索方法として「フィールドの先頭」とします。検索対象のフィールドは「address」、検索する値として作成した対応表の「都道府県名」。置換方法として、「フィールドをレコードに追加」とし、作成した対応表の「prefecture_id」のみにチェックを入れます。
これでaddressの値の先頭から都道府県名に一致したprefecture_cdが付加されます。
あとは不要なフィールドをセレクトツールで削除して、サンプリングツールなどで最初から10レコード抽出すれば完成です。
この方法は、全国のデータに対して実行しないといけない場合も利用可能です。
正規表現ツールと結合ツールを使った方法
都道府県名も独立したフィールドとしてほしい、ということになるとこの方法が良いかもしれません。そうでない場合は若干冗長な方法です。
この方法は結合ツールのところでレコードの順序が入れ替わってしまうため、順序を保存するために最初にレコードIDツールを入れています。その後、正規表現ツールを使っています。
正規表現ツールの設定は以下の通りです。今回は数が少ないため手抜きの方法を取っています。addressの値の先頭からカッコ内の都道府県名のいずれかに合致すれば一致した都道府県名が得られるようになっています。
^(埼玉県|千葉県|東京都|神奈川県)
正規表現ツールの設定として、解析する列は「address」、変換する形式は「^(埼玉県|千葉県|東京都|神奈川県)」とします。これは、「^」が行頭を示します。次に各都道府県を「|」(パイプ)で区切っていますがこれはパイプで区切ったいずれか、ということを示します。ですので、行頭の各都道府県名に一致するようになりますが、都道府県名をカッコでくくっているので、出力をパースにすれば各一致した都道府県名が結果として得られます。
全国など数が多い場合は、もう少ししっかりした正規表現式を作るべきです。例えば、以下のような式です。
^(.*?[都道府県])
いずれにしても、これで都道府県名のフィールドが得られますので、対応表と結合していきましょう。「特定のフィールドで結合」を選択し、キーフィールドは「都道府県」です。ついでに、不要なフィールドは削除します。
この後、レコードIDの昇順で並び替えることで元の順序通りになるので、不要になるRecordID列をセレクトツールで削除し、頭から10件抽出すれば完了です。以下のようなワークフローになります。
なお、正規表現ツールの代わりにフォーミュラツールを使うこともできます。以下のような計算式となります。
REGEX_Replace([address], "^(埼玉県|千葉県|東京都|神奈川県).*", "$1")
まとめ
今回はコード値を付与する問題でした。数が少ない場合は単純なIF文で可能ですが、付与するコードが多い場合は対応表(いわゆるマスター)を作成し、それと結合する方法をお勧めします。
コメント