# データ クレンジング

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. 次のスクリプトを入力します。
   ```
   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 | 名前 | [Country] (国) | [Code] (コード) |
| --- | --- | --- | --- |
| 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 ステートメントの上に以下を入力します。
   ```
   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);
   ```
3. `Country,` を含む行を次のように修正します。
   ```
   ApplyMap('CountryMap', Country) as Country,
   ```

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

   この結果、テーブルは次のようになります。

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

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

   ApplyMap()ApplyMap() 関数を使用してロードしたデータのテーブル ![ApplyMap 関数を使用してロードしたデータのテーブル。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-applymap.png)

   様々なつづりで表記された United States が、すべて US に変換されます。1 つのレコードはつづりが間違っているため、ApplyMap() 関数はこれを項目値に変更していません。ApplyMap() 関数を使用する際に、3 番目のパラメータを使ってマッピング テーブルに一致する値がない場合のデフォルトの数式を追加することができます。
5. 'US' を ApplyMap() 関数の 3 番目のパラメータとして追加し、国名が正しく入力されなかった場合に対応します。
   ```
   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);
   ```
6. [データのロード] をクリックします。

   この結果、テーブルは次のようになります。

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

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

   ApplyMapApplyMap 関数を使用してロードしたデータのテーブル ![](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-applymap-updated.png)

情報メモApplyMap() の詳細については、Qlik Community のブログ記事「[Don't join - use Applymap instead](https://community.qlik.com/t5/Qlik-Design-Blog/Don-t-join-use-Applymap-instead/ba-p/1467592)」 (結合しない - Applymap で代用) を参照してください。

## MapSubstring() 関数

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

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

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

次の手順を実行します。

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

   CodeMapテーブルでは、数値の 1～5 と 11 がマッピングされます。
2. スクリプトの Data セクションで、Code ステートメントを次のように修正します。
   ```
   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);
   ```
3. [データのロード] をクリックします。

   この結果、テーブルは次のようになります。

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

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

   MapSubStringMapSubString 関数を使用してロードしたデータのテーブル ![MapSubString 関数を使用してロードしたデータのテーブル。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-mapsubstring.png)

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

情報メモMapSubstring() の詳細については、Qlik Community のブログ記事「[Mapping … and not the geographical kind](https://community.qlik.com/t5/Qlik-Design-Blog/Mapping-and-not-the-geographical-kind/ba-p/1463192)」(地理学ではないマッピング) を参照してください。

## 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 ステートメントを終了させます。つまり Country が Unmap ステートメントの後にロードされると、CountryMap は適用されません。

次の手順を実行します。

1. Data テーブルのスクリプトを次のスクリプトで置き換えます。
   ```
   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;
   ```
2. [データのロード] をクリックします。

   この結果、テーブルは次のようになります。

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

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

   Map … UsingMap … Using 関数を使用してロードしたデータのテーブル ![Map … Using 関数を使用してロードしたデータのテーブル。](https://help.qlik.com/ja-JP/cloud-services/Subsystems/Hub/Content/Resources/Images/tutorial-data-cleansing-mapusing.png)