パース系ツールについてさわってみた #alteryx #23 | Alteryx Advent Calendar 2016

DI部の大滝です。

当エントリは『Alteyx Advent Calendar 2016』の23日目のエントリです。
Alteryx Advent Calendar 2016 - Qiita
Alteryx Advent Calendar 2016 | シリーズ | Developers.IO

前回は変換系ツールについて触ってみましたが、今回は以下のパース系のツールについて触ってみました。 (全ツールの一覧についてはこちらを参照してください。)

  • DateTime
  • RegEX
  • Text To Columns
  • XML Parse

DateTime

DateTime Toolは日付の形式を変換(標準化)して後続処理で式や関数で日付データを扱いやすくするためのツールです。 (DateTime Tool
扱えるデータの型は文字列型と日付型(Date/Time)があります。まずは日付型のデータについてやってみます。
Date Time Now Toolを使って日付を生成し、selectツールで日付型に変更してから変換します。
1-01.datetimeフロー
Date Time Now Toolで生成する日付の形式に「yyyy-MM-dd」を選択します。
1-02.datetimenow設定
Select Toolで「DateimeNow」のTypeをString→Dateに変更します。 DateTime Toolで「Conversion Mode」を「Convert From Date/Time to Formatted String」に設定します。「Desierd Format for Output String」で「Month dd,yy」を設定します。
1-03.datetime設定

実行してみます。日付の形式が変換されました。

1-04.実行結果
続いて設定を文字列型の日付データにして実行してみます。文字列型のデータの場合は先ほどの日付型とは違い、変換する日付の形式を選択するのでなく、変換元の文字列の形式を指定します。変換される日付の形式は選択できなく変換後は「yyyy-MM-dd」形式に統一されるようになっています。
Date Time Now Toolで生成する日付の形式を「day, dd Month,yyyy」に変更します。続いてSelect Toolで「DateimeNow」のTypeをStringに戻します。
最後にDateTime Toolで「Conversion Mode」を「Convert From String Field to Date/Time Field」に設定します。「Formatted input String Filed」で「day, dd Month,yyyy」にして入力データの形式に合わせます。
1-05.datetime設定2

実行してみます。日付の形式が「yyyy-MM-dd」に変換されました。

1-06.実行結果2

RegEX

RegEX Toolは正規表現ルールでデータをパースしてくれるツールです。
Regular Expression Tool
RegEX Toolには以下の4種類のパース方法があります。

  • Replace
  • Tokenize
  • Parse
  • Match

Replace

Replaceは正規表現にマッチした文字列を指定した文字列に置換します。Alteryxのサンプルデータにある「ComporserJoinData.xls」を使用して置換してみます。
<サンプルデータ>
2-01.サンプルデータ
このデータはお店の名前と電話番号が含まれているデータですが、電話番号項目の下4桁をマスクしてみます。Input Data ToolにRegEX Toolをつなげます
2-02.replaceフロー
RegEX Toolを選択して「Filed to Parse」から対象項目のPhoneを選択します。次に「Regular Expression」に以下を入力します。

¥d{4}$

「Replacement Text」に置換する文字「****」を入力します。
2-03.replace設定
実行してみます。Phoneがマスクされました。
2-04.replace結果

Tokenize

Tokenizeは正規表現を使ってトークン化をします。先ほどのサンプルデータを使ってName項目のアルファベットが連続している文字を抽出してみます。RegEX Toolを追加しサンプルデータを読み込んでるInput Data Toolに接続します。
2-05.tokenフロー
RegEX Toolを選択し「Output Method」からTokenizeを選択します。「Regular Expression」に以下を入力します。

($S)¥1

2-06.token設定
実行してみます。Name項目内にある連続するアルファベットが抽出されました。
2-07.token結果

Parse

Parseは正規表現のグループ化を使って項目を分けることができます。また出力する項目の名前も設定することができます。
先ほどのサンプルデータにあるPhone項目についてカッコやハイフンを除去し数値の3桁、4桁、4桁に項目を分かれるようにしてみます。こちらもさっきほ同様にRegEX Toolを追加しInput Data Toolに接続します。
RegEX Toolを選択し「Filed Parse」から 対象項目のPhoneを選択します。「Output Method」からParseを選択します。「Regular Expression」に以下を入力します。

^\((\d{3})\) (\d{3})-(.+$)

入力すると正規表現が解釈され「Output Fileds」項目が3つ追加されます。追加された「Output Filed」の項目を「Tel1」「Tel2」「Tel3」と変更します。
2-08.Parse設定
実行してみます。Phone項目が3つに分割され、項目名も変わっていることがわかります。
2-09.Parse結果

Match

Matchは正規表現に一致したかどうかの真偽判定(1 or 0)結果を出力します。
先ほどのサンプルデータのName項目に「pet」という文字が店の名前に含まれるか判定してみます。 こちらも先ほどと同様にRegEX Toolを追加しInput Data Toolに接続します。
RegEX Toolを選択し「Output Method」からMatchを選択します。「Regular Expression」に以下を入力します。

^.*pet.*$

2-10.match設定
実行してみます。真偽結果が追加されたのがわかります。結果はTrue/Flaseで表示されていますがこれは結果の型がBoolになっているためで、Selectツールで結果の型をInt16に変換すれば0/1に変わります。
2-11.match結果

Text To Columns

Text To Columns Toolは区切り文字で文字を分割してくれるツールです。
Text To Columns Tool
TextInput Toolで以下のようなデータを用意して分割結果を確認したいと思います。

data
1,2,3,4,5>
"1,2",3,4,5
(1,2),
[1,2],3,4,5
1,,3,4,5

TextInput Toolを配置して値を入力します。
3-01.InputData設定
TextInput ToolにText To Columns Toolを接続します。
3-02.TextToCloumnsフロー
Text To Columns Toolを選択します。Delimitersはデフォルでカンマになっているので今回はこのまま使用します。
3-02.TextToCloumns設定

実行してみます。カンマでデータが区切られたのがわかります。

3-02.TextToCloumns結果1
ただし、data3については「3,4,5」となっています。これは設定の「Split to Colums」の「#of Colums」が3になっいるためです。「#of Colums」は分割する列数の設定になります。そのため区切った文字が3つ以上ある場合、最後の列には分割されないで表示されています。この設定を増やすことで分割される列数を変えることができます。
設定した列数より、分割した列数が多くなった場合の振る舞いは「Extra Colums」項目で変更することがあります。以下のような設定が選べます。

  • Leave Extra in Last Field:最後の列に分割しないで表示します。
  • Drop Extra with Warning:多くなった列は切り捨てられ、警告が表示されます。
  • Drop Extra without Warning:多くなった列は切り捨てられ、警告も表示されません。
  • Error:実行時にエラーとなります。

また「Advanced Options」を設定することで囲み文字内に区切り文字が存在する場合は区切り文字として認識しないようにする設定することができます。以下オプションの設定項目です。

  • Ignore Delimiters in Quotes:ダブルクォーテーションで囲まれた区切り文字は区切り文字として認識しません。
  • Ignore Delimiters in Single Quotes:シングルクォーテーションで囲まれた区切り文字は区切り文字として認識しません。
  • Ignore Delimiters in Parenthesis:パーレン( )で囲まれた区切り文字は区切り文字として認識しません。
  • Ignore Delimiters in Brackets:ブラケット[ ]で囲まれた区切り文字は区切り文字として認識しません。
  • Skip Empty Fields:空の値をスキップします。

「Advanced Options」項目全ての値にチェックを入れて再度実行してみます。
3-02.TextToCloumns結果2
最初の実行結果と比べ囲み文字が設定されている箇所は分割されていないのがわかります。また5行目のデータでは値が空のデータはスキップして左にデータが寄っていることがわかります。

XML Parse

XML Parse ToolはXMLを解析してくれるツールです。
XMLParse Tools
AlteryxのサンプルデータにあるDonuts.xmlを使ってやってみたいと思います。
以下サンプルデータの内容です。

<items>
	<item id="01" type="Donut">
		<name>Cake</name>
		<ppu>0.60</ppu>
		<batters>
			<batter id="10">Regular</batter>
			<batter id="11">Chocolate</batter>
			<batter id="12">Blueberry</batter>
			<batter id="13">Devil's Food</batter>
		</batters>
		<topping>
			<topping id="100">None</topping>
			<topping id="101">Glazed</topping>
			<topping id="102">Sugar</topping>
			<topping id="103">Powdered Sugar</topping>
			<topping id="104">Chocolate</topping>
			<topping id="105">Chocolate with Sprinkles</topping>
			<topping id="106">Maple</topping>
		</topping>
	</item>
	<item id="02" type="Donut">
		<name>Raised</name>
		<ppu>0.65</ppu>
		<batters>
			<batter id="10">Regular</batter>
		</batters>
		<topping>
			<topping id="100">None</topping>
			<topping id="101">Glazed</topping>
			<topping id="102">Sugar</topping>
			<topping id="104">Chocolate</topping>
			<topping id="106">Maple</topping>
		</topping>
	</item>
	<item id="03" type="Donut">
		<name>Buttermilk</name>
		<ppu>0.50</ppu>
		<batters>
			<batter id="10">Regular</batter>
			<batter id="11">Chocolate</batter>
		</batters>
	</item>
	<item id="04" type="Bar">
		<name>Bar</name>
		<ppu>0.70</ppu>
		<batters>
			<batter id="10">Regular</batter>
		</batters>
		<topping>
			<topping id="104">Chocolate</topping>
			<topping id="106">Maple</topping>
		</topping>
	</item>
	<item id="05" type="Twist">
		<name>Twist</name>
		<ppu>0.75</ppu>
		<batters>
			<batter id="10">Regular</batter>
		</batters>
		<topping>
			<topping id="101">Glazed</topping>
			<topping id="102">Sugar</topping>
		</topping>
	</item>
	<item id="06" type="Filled">
		<name>Filled</name>
		<ppu>0.80</ppu>
		<batters>
			<batter id="10">Regular</batter>
		</batters>
		<topping>
			<topping id="101">Glazed</topping>
			<topping id="103">Powdered Sugar</topping>
			<topping id="104">Chocolate</topping>
			<topping id="106">Maple</topping>
		</topping>
	</item>
</items>


Input Data Toolでxmlファイルを読み込むとPreviewに表示されているようにルート階層の1つ下の要素については既に解析してくれている状態になります。
4-01.XMLParseプレビュー
XML Parse Toolではbatters要素の子要素にあるbatter要素を解析してみたいと思います。Input Data Toolを選択して、「Returun Outer XML」にチェックを入れ、XMLタグを後続に渡すようにします。
4-02.InputData設定
続いてInput Data ToolにSelect Toolを接続し、必要な「batters_OuterXML」にのみチェックを入れます。
4-03.Select設定
Select ToolにXML Parse Toolを接続します。
4-04.XMLParseフロー
Select Toolで解析する要素を絞り込んでいるためXML Parse Toolの設定は特に不要なのでこのまま実行してみます。
4-05.XMLParse結果
batterタグの要素内容と属性idの値が取得できました。XML Parse Toolの設定についてみてみます。
4-06.XMLParse設定
「Field with XML Data」項目は解析するXMLを指定します。「XML Element to Parse」はXMLの解析場所を指定します。「Root」を選択した場合、対象となるXML(今回の場合だとbatters_OuterXML)を全て解析します。「Auto Delected Child」を選択した場合は、対象となるXMLの子要素を自動的に検出して解析を行います。「Specific Child Name」は指定した要素に対して解析を行います。
「Auto Delected Child」の仕様ですが解析した要素の中で一番多い要素名について解析を行うようです。
今回XML Parse Toolで解析したXMLは以下のbatters要素になりますが、batter要素と同階層にbatter2と言う要素を追加して実行したところbatter2については無視されました。

<batters>
  <batter id="10">Regular</batter>
  <batter id="11">Chocolate</batter>
  <batter id="12">Blueberry</batter>
  <batter id="13">Devil's Food</batter>
  <batter2 id="14">Strawberry</batter2>  ←要素を追加したが解析されなかった。
</batters>

まとめ

今回はAlteryxにあるツールの中でもパース系のツールについて触ってみました。明日は弊社田子による「Input DataツールにいろいろなパターンのCSVファイルを読ませてみる」です。お楽しみにしてください!