Early Access: The content on this website is provided for informational purposes only in connection with pre-General Availability Qlik Products.
All content is subject to change and is provided without warranty.
跳到主要内容 跳到补充内容

数据清理

有时候,当您将源数据加载到 Qlik Sense 时,不需要您在 Qlik Sense 应用程序中等待完成。Qlik Sense 提供了一系列函数和语句,用于将数据转换成所需的格式。

当脚本运行时可以在 Qlik Sense 脚本中使用映射来替换或修改字段值或名称,以便于可以使用映射清理数据,并使它更加一致或替换部分或所有的字段值。

当您从不同表格加载数据时,表示相同事物的字段值并不总是拥有一致的名称。由于缺乏一致性会妨碍关联,因而需要解决此问题。这一问题通过创建映射表比较字段值可以得到完美解决。

映射表

通过 MappingMapping 加载的表格的处理方式不同于其他表格。它们存储在内存的单独区域内,并在脚本运行时仅用作映射表。在脚本运行后,将自动删除这些表格。

规则:

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

Mapping 函数和语句

本教程将详细讨论以下映射函数/语句:

Mapping 前缀

ApplyMap()

MapSubstring()

Map … Using 语句

Unmap 语句

Mapping 前缀

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 表格存储两列:CountryNewCountryCountry 列用于存储在 Country 字段中以不同方式输入的国家/地区。NewCountry 列用于存储映射值的方式。该映射表将用于存储 Country 字段中一致的 US 国家/地区值。例如,如果 U.S.A. 存储在 Country字段中,则会将其映射为 US

ApplyMap() 函数

使用 ApplyMap() 可根据之前创建的映射表替换字段中的数据。在可以使用 ApplyMap() 函数之前需要加载映射表。您将加载的表格 Data.xlsx 中的数据如下:

数据表
IDNameCountryCode
1John BlackU.S.A.SDFGBS1DI
2Steve JohnsonU.S.2ABC
3Mary White美国DJY3DFE34
4Susan McDanielsuDEF5556
5Dean SmithUSKSD111DKFJ1

注意应以不同方式输入国家/地区。为了使 Country 字段保持一致,应先加载映射表,然后再使用 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() 函数的第一个参数的映射名称应使用单引号括起来。第二个参数是包含要替换的数据的字段。

  6. 单击加载数据
  7. 最终生成的表格如下所示:

    表格示出了使用 ApplyMap() 函数加载的数据

    表格示出了使用 ApplyMap 函数加载的数据。

    United States 的不同拼写已更改为 US。如果存在一个拼写不正确的记录,则 ApplyMap() 函数不会更改该字段值。使用 ApplyMap() 函数,您可以使用第三个参数添加默认表达式,如果映射表不包含匹配值。

  8. 添加 'US' 作为 ApplyMap() 函数的第三个参数,用于处理当国家/地区输入不正确时的情况:
  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中该文章:不要联接 - 改为使用 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=3ID=4 出现多次,则文本也重复。ID=4Susan McDaniels 在其代码中包含 6。由于在 CodeMap 表中不映射 6,因此它保持不变。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 语句,因此如果在执行 Unmap 语句后加载 Country,将不会应用 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 函数加载的数据。

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们如何改进!