# 数据清理

当从不同表格加载数据时，要注意表示相同事物的字段值并不总是拥有一致的名称。由于缺乏一致性不仅让人烦恼，而且还会阻碍关联性，因而此问题必须得到解决。这一问题通过创建映射表比较字段值可以得到完美解决。

## 映射表

通过 mapping load 或 mapping select 加载的表格的处理方式不同于其他表格。它们存储在内存的单独区域内，并在脚本执行期间仅用作映射表。脚本执行完后，它们会自动被丢弃。

### 规则：

* 映射表必须拥有列，第一列包含比较值，第二列包含所需的映射值。
* 两列必须命名，且名称之间不存在关联。列名称不得与常规内部表格的字段名称相联系。

## 使用映射表

当加载几个列有国家/地区的表格时，您会发现，同一个国家/地区具有几个不同的名称。在此示例中，U.S.A. 列为 US、U.S. 和 United States。

为了避免在串联表中以三种不同的记录表示 United States，可以创建一个与所示表格类似的表格，然后将其作为映射表加载。

整个脚本外观如下：

`CountryMap:` `Mapping LOAD x,y from MappingTable.txt` `(ansi, txt, delimiter is ',', embedded` `labels);` `Map Country using CountryMap;` `LOAD Country,City from CountryA.txt` `(ansi, txt, delimiter is ',', embedded labels);` `LOAD Country, City from CountryB.txt` `(ansi, txt, delimiter is ',', embedded labels);`

mapping 语句加载文件 MappingTable.txt 作为包含标签 CountryMap 的映射表。

map 语句使用之前加载的映射表 Country 启用字段 CountryMap 的映射。

LOAD 语句加载表格 CountryA 和 CountryB。这些表格由于具有相同的字段设置将会串联起来（包括字段 Country），该字段的字段值用来与映射表的第一列进行比较。然后，您会发现字段值 US、U.S. 和 United States 将被映射表第二列的值所替换，即 USA。

在生成由 Qlik Sense 表格存储的字段的事件链中，自动映射是最后环节。对于典型的 LOAD 或 SELECT 语句，事件顺序大致如下所示：

1. 表达式评估
2. 用 as 重命名字段
3. 用 alias 重命名字段
4. 表格名限定性条件（如果适用）。
5. 如果字段名称匹配，则映射数据

这意味着并非每次遇到作为表达式组成部分的字段名时都会执行映射，而是在当值存储在 Qlik Sense 表格中的字段名之下时才执行映射。

要禁用映射，可以使用 unmap 语句。

对于表达式级别映射，可以使用 applymap 函数。

对于子字符串级别映射，可以使用 mapsubstring 函数。

## 了解详情

* [映射](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptPrefixes/Mapping.htm)
* [Map](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Map.htm)
* [Unmap](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/ScriptRegularStatements/Unmap.htm)
* [映射函数](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/Scripting/MappingFunctions/mapping-functions.htm)