Challenge #40: Parsing a HTML File ~HTMLファイルのパース~ – Alteryx Weekly Challenge
こんにちは。Alteryxサポートエンジニアとして勉強中のスズです。
Alteryx Communityで公開されているWeekly Challengeに挑戦するシリーズ。今回はHTMLファイルのパースに挑戦します。
動作環境
当エントリの執筆には、以下の環境を利用しています。
- Windows 10 Pro
- Alteryx Designer 2019.1.4.57073 英語版
Challenge #40: Parsing a HTML File
お題
今回挑戦するお題はこちら。
ワークフローとは別にyxdbファイルでデータが提供されています。そのデータをAlteryxで読み込むと、以下のように表示されます。
「DownloadData」列の中身を見てみると、h3
やh4
といった部分に今回処理していくデータがあります。
※以下の画像はExcelファイルに出力したものです。
Output側のデータは以下のようになっています。「DownloadData」列を処理してデータを用意します。
解答
今回作成するワークフローは以下のとおりです。
yxdbファイルをAlteryxで読み込むと、処理するデータ「DownloadData」列で1つにまとめられています。まずはText To ColumnsツールでDelimitersに\n
を指定して、データを分けていきます。\n
を指定すると、改行でデータを分けるようになります。また、Split to rowsを指定することで、同じ列にデータを分けていきます。
出力したデータは以下のようになっています。
分けたデータを分類していきます。Formulaツールを使用して、新しく「Category」列をV_WString型で作成します。
以下の条件で出力します。
- 「DownloadData」列に
h3
が含まれる場合は「Physician」を出力 - 「DownloadData」列に
h4
が含まれる場合は「Address」を出力 - 「DownloadData」列に
h5
が含まれる場合は「Practice」を出力 - それ以外の場合はNullにする
「Category」列がNullになっているデータは不要になりますので、Filterツールを使って取り除きます。
Nullが取り除かれたデータを確認してみます。「Physician」「Address」「Practice」のセットで1人分のデータになります。
Multi-Row Formulaツールを使用してIDを割り当てていきます。新しく「ID」列をInt32型で作成します。
Expressionには以下のとおり設定しています。「Category」列が「Physician」の場合は1つ上の「ID」列の数字に1足して出力し、それ以外の場合は1つ上の「ID」列の数字を出力します。これにより1人分のデータに同じIDを割り当てていきます。
iif([Category] == "Physician", [Row-1:ID] + 1, [Row-1:ID])
Cross Tabツールを使用して、「Category」列のカテゴリ別に「DownloadData」列のデータを出力します。
以下のとおり設定しています。
- Group Data by these Values: 「ID」列
- New Column Headers: 「Category」列
- Value for New Columns: 「DownloadData」列
以下のデータが出力されました。
「Address」列には、最終的に「Address」列に出力するデータのほかに、「City」列に出力するデータが含まれています。Formulaツールを使用して新しく「City」列をV_WString型で作成します。
以下の設定をしています。
Right([Address], Length([Address]) - FindString([Address], "/>") - 2)
Left([City], FindString([City], "</h4>"))
RegExツールを使用して、「Address」列から住所のデータを抜き出します。
Output MedhodにParse
を設定し、Regular Expression:には以下の通り設定しています。
<span>(.*)</span>
RegExツールをもう1つ使用し、同じように「Physician」列から人名のデータを抜き出します。
Output MedhodにParse
を設定し、Regular Expression:には以下の通り設定しています。
.*>(.*)</a>
Formulaツールを使用してデータを整えていきます。
「Practice」列には以下の式を設定して不要な文字列を削除します。
Trim(Left([Practice], FindString([Practice], "</h5>")), "<h5>")
また、「Practice」列「City」列「RegExOut1」列に、空になっているデータをNullにするよう設定します。
IIF(IsEmpty(<列>), Null(), <列>)
Selectツールを使用して、不要な列の削除、列名の修正、順番の並べ替えを行います。
Data Cleansingツールを使用して、データに含まれる不要な空白を削除します。
結果を確認して完成です。
最後に
今回はWeekly ChallengeのChallenge #40: Parsing a HTML Fileに挑戦しました。
サンプルワークフローのご案内
クラスメソッドでご契約のユーザー様向けに、当ブログでご紹介したワークフローを専用ポータルにて公開しております。当エントリでご紹介したワークフローも公開予定ですので、ご参考にしていただきますと幸いです。
Alteryxの導入なら、クラスメソッドにおまかせください
日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。