# SubField 脚本和图表功能

SubField() 用于从父字符串字段提取子字符串组成部分，其中原始记录字段由两个或更多用分隔符分隔的部分构成。

Subfield() 函数可用于（例如）从由全名、路径名的组成部分构成的记录的列表中提取名字和姓氏，或用于从逗号分隔的表格中提取数据。

如果在忽略可选 field\_no 参数的 LOAD 语句中使用 Subfield() 函数，则会为每个子字符串生成一个完整记录。如果使用 Subfield() 加载多个字段，则会创建所有组合的 Cartesian 产品。

语法：

SubField(text, delimiter[, field\_no ])

返回数据类型： 字符串

参数

| 参数 | 描述 |
| --- | --- |
| text | 原始字符串。可以是硬编码文本、变量、货币符号扩展或其他表达式。 |
| delimiter | 输入 text 中将字符串分成各组成部分的字符。 |
| field\_no | 可选的第三个参数是整数，用于指定返回父字符串 text 的哪些子字符串。使用值 1 可以返回第一个子字符串，使用值 2 可以返回第二个字符串，以此类推。<br><br><ul> <li>如果 <span>field_no</span> 为正值，子字符串是自左至右提取的。</li> <li>如果 <span>field_no</span> 为负值，子字符串是自右至左提取的。</li> </ul> |

提示注释 可以使用 SubField() 代替复杂的函数组合（例如 Len()、Right()、Left()、Mid()）和其他字符串函数。

示例：图表表达式

| 示例 | 结果 |
| --- | --- |
| `SubField( 'abc;cde;efg',   ';' ,2 )` | 返回 `cde` |
| `SubField( Null,   ';' ,1 )` | 返回一个空字符串 |
| `SubField( ';',   ';' ,1 )` | 返回一个空字符串 |
| `SubField( '\Users\ext_jrb\Documents\Qlik\Sense\Apps;','\',-3 )` | 返回 `Qlik` |

## 示例 - SubField 基本原理

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 图表表达式

概述

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 加载到名为 `Example` 的数据表中的数据集。

* 数据表中有一个名为`Name` 的字段。

加载脚本

```
Example:
Load * inline [
Name
Dave Owen
Joe Tem
];
```

结果

加载数据并打开工作表。创建新表并将该字段添加为维度：

* ` Name
                                   `

创建以下计算维度：

* `=SubField(Name, ' ',1)`，用于提取出现在空格 `' '` 分隔符之前的第一个子字符串。

* `=SubField(Name, ' ',-1)`，用于提取出现在空格 `' '` 分隔符之前的第一个子字符串，从字符串右侧开始。

Results table

| Name | SubField(Name, ' ',1) | SubField(Name, ' ',-1) |
| --- | --- | --- |
| Dave Owen | Dave | Owen |
| Joe Tem | Joe | Tem |

`SubField()` 函数的作用是将 `field_no` 参数设置为 1，从而提取 `Name` 的第一个子字符串。由于 `field_no` 的值为正值，因此以从左到右的顺序提取子字符串。第二个函数调用通过将 `field_no` 参数设置为 -1 来提取第二个子字符串，该字段按照从右到左的顺序提取子字符串。

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 加载脚本

加载脚本

打开 数据加载编辑器，并将以下加载脚本添加到新部分。

```
FullName:
LOAD * inline [
Name
'Dave Owen'
'Joe Tem'
];

SepNames:
Load Name,
SubField(Name, ' ',1) as FirstName,
SubField(Name, ' ',-1) as Surname
Resident FullName;
Drop Table FullName;
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* `Name`
* `FirstName`
* `SurName`

Results table

| Name | FirstName | SurName |
| --- | --- | --- |
| Dave Owen | Dave | Owen |
| Joe Tem | Joe | Tem |

解释

`SubField` 函数的作用是将 `field_no` 参数设置为 1，从而提取第一个子字符串 `Name`。由于 `field_no` 的值为正值，因此以从左到右的顺序提取子字符串。第二个函数调用通过将 `field_no` 参数设置为 -1 来提取第二个子字符串，该字段按照从右到左的顺序提取子字符串。

## 示例 – SubField 场景

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 图表表达式

概述

产品数据集包含产品表。表中的每个产品都有一个标记字段，用于标识产品区域。产品的标记字段可以有多个值。例如，小组件 A 有以下标记：电子产品、小工具、家用。标记值用管道字符 (|) 分隔。本例向您展示如何使用 `SubField` 函数提取特定的标记值。

打开数据加载编辑器，并将下面的加载脚本添加到新部分。

加载脚本包含：

* 加载到名为 `Example` 的数据表中的数据集。

* 数据表中有以下字段：

  * `ProductID`

  * `ProductName`

  * `Tags`

  * `Sales`

加载脚本

```
Example:
Load  *
INLINE [
ProductID, ProductName, Tags, Sales
1, Widget A, Electronics|Gadgets|Home, 150
2, Widget B, Electronics|Accessories, 200
3, Widget C, Furniture|Home, 100
4, Widget D, Gadgets|Accessories, 250
];
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* ` ProductID
                                   `

* `ProductName`

* `Tags`

创建以下计算维度：

* `=SubField(Tags, '|',1)`，用于提取 `Tags` 字段中的第一个项目。

* `=SubField(Tags, '|',2)`，用于提取 `Tags` 字段中的第二个项目。

* `=SubField(Tags, '|',3)`，用于提取 `Tags` 字段中的第三个项目。

Results table

| ProductID | ProductName | Tags | SubField(Tags, '\|', 1) | SubField(Tags, '\|', 2) | SubField(Tags, '\|', 3) |
| --- | --- | --- | --- | --- | --- |
| 1 | Widget A | Electronics\|Gadgets\|Home | Electronics | Gadgets | Home |
| 2 | Widget B | Electronics\|Accessories | Electronics | Accessories | - |
| 3 | Widget C | Furniture\|Home | Furniture | Home | - |
| 4 | Widget D | Gadgets\|Accessories | Gadgets | Accessories | - |

`SubField` 函数的输出已成功从原始 `Tags` 字符串中的相关位置返回标记。

[](https://help.qlik.com/en-US/sense/Subsystems/Hub/Content/Sense_Hub/Scripting/StringFunctions/SubField.htm)

#### 加载脚本

加载脚本

打开 数据加载编辑器，并将以下加载脚本添加到新部分。

```
LOAD DISTINCT
Instrument,
SubField(Player,',') as Player,
SubField(Project,',') as Project;

Load * inline [
Instrument|Player|Project
Guitar|Neil,Mike|Music,Video
Guitar|Neil|Music,OST
Synth|Neil,Jen|Music,Video,OST
Synth|Jo|Music
Guitar|Neil,Mike|Music,OST
] (delimiter is '|');
```

结果

加载数据并打开工作表。创建新表并将这些字段添加为维度：

* Instrument

* Player

* Project

Results table

| Instrument | Player | Project |
| --- | --- | --- |
| Guitar | Mike | Music |
| Guitar | Mike | Video |
| Guitar | Mike | OST |
| Guitar | Neil | Music |
| Guitar | Neil | Video |
| Guitar | Neil | OST |
| Synth | Jen | Music |
| Synth | Jen | Video |
| Synth | Jen | OST |
| Synth | Jo | Music |
| Synth | Neil | Music |
| Synth | Neil | Video |
| Synth | Neil | OST |

解释

此示例演示了如何使用 Subfield() 函数的多个实例，每个实例都不考虑 field\_no 参数，其中相同的 LOAD 语句会创建所有组合的 Cartesian 产品。DISTINCT 选项用于避免创建重复记录。