データサイエンス100本ノックをAlteryxで。16日目(解答)

100本ノック

このページは解答編です。

↓ネ

↓タ

↓バ

↓レ

↓防

↓止

答えと解説

設問はこちらでした。

P-016: 店舗データ(store.csv)から、電話番号(tel_no)が3桁-3桁-4桁のデータを全項目表示せよ。

解答ワークフローは以下のようになります。

基本的にはフィルターツールを使いますが、3桁-3桁-4桁の条件をどのようにマッチさせるか、というところがポイントです。

  1. ハイフンの位置を確認する
  2. GetWord関数を使った方法
  3. 列分割ツールを使った方法
  4. 正規表現ツール
  5. REGEX_Match関数

1. ハイフンの位置を確認する

最も簡単な方法として、ハイフンの位置を確認することでしょうか。つまり、4文字目と8文字目にハイフンが来れば、3桁-3桁-4桁であると定義することです。

つまり、以下のように、3文字目と8文字目を切り取って、ハイフンかどうかを確認するような関数を使います。

Substring([tel_no],3,1)= "-" AND
Substring([tel_no],7,1)= "-"

SubString関数は、文字列を切り出す機能を持っています。使い方としては、以下のような感じです。

SubString(処理する文字列, 切り出しを開始する位置, 切り出す文字数)

※切り出しを開始する場所は、最初を0文字目としてカウントします

実際のフィルターツールの設定は以下の通りです。

実際のワークフローは以下の通りです。

しかしながら、例えばすべての文字がハイフンのダミーデータだったり、入力間違いで数字以外のデータがある場合は正しくない結果が出る可能性があります。

2. GetWord関数を使った方法

こちらの方法は少々トリッキーかもしれません。GetWord関数というのは、単語を抽出する関数です。例えば、英語の文章があった場合、空白区切りで区切った場合に区別できるものを単語と言っています。例えば、I have a pen.という文章があれば、I、have、a、penと分割でき、例えば3番目、とすると「a」を抜き出すことが可能です。

GetWord関数は以下のようにして使います。

GetWord(文章, 抜き出したい場所)

しかしながら今回扱うのは電話番号ですが、「-」を空白に置換すればGetWord関数で分割可能になります。置換にはReplace関数が利用可能です。

Replace関数は以下のようにして使います。

Replace(処理対象の文字列, 検索する文字列, 置き換える文字列)

つまり、今回の場合はハイフンを空白にするので、以下のような計算式になります。

Replace([tel_no], "-", " ")

さらに切り出した文字列の桁数を取得しましょう。文字列の長さを調べるには、Length関数を使います。

Length(文字列)

これらを組み合わせると、最終的な回答は以下の通りとなります。

Length(GetWord(Replace([tel_no], "-", " "),0))=3 AND
Length(GetWord(Replace([tel_no], "-", " "),1))=3 AND
Length(GetWord(Replace([tel_no], "-", " "),2))=4

フィルターツールの設定は以下の通りです。

実際のワークフローは以下のようになります。

3. 列分割ツールを使った方法

次に、列分割ツールを使った手法をご紹介します。基本的には解答2のGetWordを使った手法に近いです。ワークフローは以下のようになります。

列分割ツールは、区切り文字を指定することで複数の列に分割するツールです。つまり、今回の場合はハイフンで列を分割し、その後各フィールドの長さを見ていくことで実現します。

まず、列分割ツールを見ていきます。基本的な使い方としては、分割する列を指定し、区切り文字、分割する列数を指定すれば完了です(その他細かい指定も可能ですが割愛します)。

今回は、分割する列を「tel_no」、区切り文字を「-」、列に分割するオプションを選択し、列数を「3」としています。

あとはフィルターツールで必要な列を抽出しましょう。フィルター条件は以下の通りです。

Length([tel_no1])=3 AND Length([tel_no2])=3 AND Length([tel_no3])=4 AND IsInteger(TrimLeft([tel_no1],"0")) AND IsInteger(TrimLeft([tel_no2],"0")) AND  IsInteger(TrimLeft([tel_no3],"0"))

実は前半の赤い部分だけでも成り立ちます。単に各分割後のフィールドの中身の値の長さが欲しいものと一致しているかどうかを見ているだけです。

残りの部分は、電話番号ということなので、数値かどうかを確認しています。IsIntegerという関数は、指定した文字列が整数に変換できるかどうかをTrue/Falseで返すものとなっていますが、頭に0がある場合、例えば「012」などは数値のように見えますが、この関数は変換できないと判定するため、TrimLeft関数で頭の「0」をカットしています。ここまで行う必要があるかどうかはケース次第かと思いますが、念のため、というところで入れています。

実際のフィルターツールの設定は以下の通りです。

4. 正規表現ツールを使った方法

若干高度な手法になりますが、正規表現ツールを使うこともできます。

今回は、「電話番号(tel_no)が3桁-3桁-4桁のデータ」ということですが、数字3文字、ハイフン、数字3文字、ハイフン、数字4文字、という意味の正規表現を作ればオッケーです。今まで色々と工夫してきましたが、こういうパターンマッチングを行いたい場合は正規表現を覚えるのが確実です。

正規表現式はこちらのようになります。

\d{3}-\d{3}-\d{4}

\d : 数値一文字

{数字} : 直前の文字の繰り返し。つまり、「A{3}」と書かれていれば「AAA」となります。\d{3}であれば、3桁の数字、という意味になります。

- : ハイフンそのものを意味します。

正規表現ツールの設定は以下の通りです。

実際のワークフローは以下のようになります。

今回のケースは非常にベーシックなパターンの一つとなるので、覚えておいても損はないかと思います。

解答ワークフローダウンロード

コメント

タイトルとURLをコピーしました