メイン コンテンツをスキップする

データ クレンジング

Qlik Sense にロードするソース データが、必ずしも Qlik Sense アプリで必要でない場合があります。Qlik Sense は、データを希望する形式に変換するための関数とステートメントのホストを提供しています。

Qlik Sense スクリプトを実行する際にマッピングを使用すると、項目値や名前の置換または変更ができます。つまり、マッピングによりデータをより整合性のあるデータに整理したり、項目値の一部または全部と置換することが可能になります。

データを異なるテーブルからロードする際、同じことを表す項目値に、一貫した名前が付いているとは限りません。この一貫性の欠如は関連性を見落とす原因にもなるため、対処が必要です。この問題は、項目値を比較するマッピング テーブルを作成することで解決できます。

マッピング テーブル

Mapping load または Mapping select からロードされたテーブルは、他のテーブルとは異なる方法で処理されます。これらのテーブルはメモリの別の領域に保存され、スクリプトの実行時にマッピング テーブルとしてのみ使用されます。スクリプトが実行されると、これらのテーブルは自動的に削除されます。

ルール:

  • マッピング テーブルは、1 列目に比較値、2 列目にマッピング値を含む 2 列構成でなければなりません。
  • 2 つの列に名前を付ける必要がありますが、名前と列に含まれる値に関連性はありません。これらの列の名前は、通常の内部テーブルの項目名とは一切関係がありません。

Mapping 関数とステートメント

このチュートリアルでは、次のマッピング関数/ステートメントについて説明します。

Mapping プレフィックス

ApplyMap()

MapSubstring()

Map … Using ステートメント

Unmap ステートメント

マッピング プレフィックス

Mapping プレフィックスは、マッピング テーブルを作成するためにスクリプトで使用します。マッピング テーブルは、ApplyMap() 関数または MapSubstring() 関数、Map … Using ステートメントと共に使用できます。

  1. 新しいアプリを作成し、名前を付けます。
  2. データ ロード エディターで新しいスクリプト セクションを追加します。
  3. このセクションを Countries と呼びます。
  4. 次のスクリプトを入力します。
  5. CountryMap: MAPPING LOAD * INLINE [ Country, NewCountry U.S.A., US U.S., US United States, US United States of America, US ];

    CountryMap テーブルには、2 つの列(Country および NewCountry) が保存されます。Country 列には、様々な表記方法で Country 項目に入力された国が保存されます。NewCountry 列には、値をマッピングする方法に関する情報が保存されます。このマッピング テーブルは、一貫性のあるUS という国の値を Country 項目に保存するために使用されます。つまり、U.S.A.Country 項目に保存されても、それは US としてマッピングされます。

ApplyMap() 関数

ApplyMap() を使用して、前に作成したマッピング テーブルに基づいて項目のデータを置き換えます。マッピング テーブルは、ApplyMap() 関数を使用する前にロードする必要があります。ロードする Data.xlsx テーブルのデータは次のようになります。

データ テーブル
ID 名前 コード
1 John Black USA SDFGBS1DI
2 Steve Johnson U.S. 2ABC
3 Mary White 米国 DJY3DFE34
4 Susan McDaniels u DEF5556
5 Dean Smith US KSD111DKFJ1

国が様々な表記方法で入力されているのが分かります。国項目に一貫性を持たせるために、マッピング テーブルをロードし、ApplyMap() 関数を使用します。

  1. 上で作成したスクリプトの下で、Data.xlsx を選択してロードし、スクリプトを挿入します。
  2. 新しく作成した LOAD ステートメントの上に以下を入力します。
  3. Data:

    これで、スクリプトは次のようになります。

    CountryMap: MAPPING LOAD * INLINE [     Country, NewCountry     U.S.A., US     U.S., US     United States, US     United States of America, US ]; 	 Data: LOAD     ID,     Name,     Country,     Code FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1);

  4. Country, を含む行を次のように修正します。
  5. ApplyMap('CountryMap', Country) as Country,

    ApplyMap() 関数の最初のパラメータには、単一引用符で囲まれたマップ名があります。2 番目のパラメータは、置換されるデータを含む項目です。

  6. [データのロード] をクリックします。
  7. この結果、テーブルは次のようになります。

    ApplyMap() 関数を使用してロードしたデータのテーブル

    ApplyMap 関数を使用してロードしたデータのテーブル。

    様々なつづりで表記された United States が、すべて US に変換されます。1 つのレコードはつづりが間違っているため、ApplyMap() 関数はこれを項目値に変更していません。ApplyMap() 関数を使用する際に、3 番目のパラメータを使ってマッピング テーブルに一致する値がない場合のデフォルトの数式を追加することができます。

  8. 'US'ApplyMap() 関数の 3 番目のパラメータとして追加し、国名が正しく入力されなかった場合に対応します。
  9. ApplyMap('CountryMap', Country, 'US') as Country,

    これで、スクリプトは次のようになります。

    CountryMap: MAPPING LOAD * INLINE [     Country, NewCountry     U.S.A., US     U.S., US     United States, US     United States of America, US ];  Data: LOAD     ID,     Name,     ApplyMap('CountryMap', Country, 'US') as Country,     Code FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1);

  10. [データのロード] をクリックします。
  11. この結果、テーブルは次のようになります。

    ApplyMap 関数を使用してロードしたデータのテーブル

情報メモApplyMap() について詳しくは、Qlik Community の次のブログ投稿を参照してください。「Don't join - use Applymap instead」 (結合しない - Applymap で代用)

MapSubstring() 関数

MapSubstring() 関数は、項目の部分的なマッピングを可能にします。

ApplyMap() で作成したテーブルに数値を文字列として記入したい場合、MapSubstring() 関数を使って数値を文字列に置換できます。

これを実行するには、まずマッピング テーブルを作成する必要があります。

  1. CountryMap セクションの末尾、かつ Dataセクションの前に次のスクリプト行を追加します。
  2. CodeMap: MAPPING LOAD * INLINE [ F1, F2 1, one 2, two 3, three 4, four 5, five 11, eleven ];

    CodeMapテーブルでは、数値の 1~5 と 11 がマッピングされます。

  3. スクリプトの Data セクションで、Code ステートメントを次のように修正します。
  4. MapSubString('CodeMap', Code) as Code

    これで、スクリプトは次のようになります。

    CountryMap: MAPPING LOAD * INLINE [     Country, NewCountry     U.S.A., US     U.S., US     United States, US     United States of America, US ];  CodeMap: MAPPING LOAD * INLINE [     F1, F2     1, one     2, two     3, three     4, four     5, five     11, eleven ];  Data: LOAD     ID,     Name,     ApplyMap('CountryMap', Country, 'US') as Country,     MapSubString('CodeMap', Code) as Code FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1);

  5. [データのロード] をクリックします。
  6. この結果、テーブルは次のようになります。

    MapSubString 関数を使用してロードしたデータのテーブル

    MapSubString 関数を使用してロードしたデータのテーブル。

    数字が Code 項目で文字列に置換されています。ID=3 および ID=4 のように数字が 1 回以上現れる場合は、テキストもまた繰り返されます。ID=4.Susan McDaniels は、そのコードに 6 がありました。6 は CodeMap テーブルにマッピングされていないので、変更されません。ID=5Dean Smith のコードには 111 がありました。これは、'elevenone' としてマッピングされています。

情報メモMapSubstring() について詳しくは、Qlik Community の次のブログ投稿を参照してください。「Mapping … and not the geographical kind」 (地理学ではないマッピング)

Map … Using

Map … Using ステートメントもまた、項目へのマッピングに使用できます。ただし、ApplyMap() とは機能が少し異なります。ApplyMap() は項目名が発生するたびにマッピングを実行しますが、Map … Using は、値が内部テーブルの項目名に保存された場合にマッピングを行います。

例を挙げて見てみましょう。スクリプトで Country 項目を複数回ロードしており、項目がロードされる度にマッピングを実行したい場合を想定します。このチュートリアルですでに説明したように ApplyMap() 関数が使用可能であり、Map … Using を使用することもできます。

Map … Using が使用されると、項目が内部テーブルに保存される際にマップが項目に適用されます。つまり、以下の例のように Data1 テーブルの Country 項目に対するマッピングが実行されますが、Data2 テーブルの Country2 項目に対するマッピングは実行されません。これは、Map … Using ステートメントが Country という名前の項目にのみ適用されることが理由です。Country2 項目が内部テーブルに保存されると、Country という名前ではなくなります。Country2 テーブルに対するマッピングを実行したい場合は、ApplyMap() 関数を使用する必要があります。

Unmap ステートメントは Map … Using ステートメントを終了させます。つまり CountryUnmap ステートメントの後にロードされると、CountryMap は適用されません。

  1. Data テーブルのスクリプトを次のスクリプトで置き換えます。
  2. Map Country Using CountryMap; Data1: LOAD     ID,     Name,     Country FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1); 					 Data2: LOAD     ID,     Country as Country2 FROM [lib://DataFiles/Data.xlsx] (ooxml, embedded labels, table is Sheet1); UNMAP;

  3. [データのロード] をクリックします。
  4. この結果、テーブルは次のようになります。

    Map … Using 関数を使用してロードしたデータのテーブル

    Map … Using 関数を使用してロードしたデータのテーブル。