# Index 脚本和图表功能

Index() 用于搜索字符串，以便找到所提供子字符串第 n 次出现的开始位置。可选的第三个参数用于提供值 n，如果省略，则值为 1。如果为负值，则从字符串的结尾开始搜索。字符串中的位置从左至右从 1 开始编号。

语法：

Index(text, substring[, count])

返回数据类型： 整数

参数

| 参数 | 描述 |
| --- | --- |
| text | 原始字符串。 |
| substring | 在 text 中搜索的字符串。<br><br>信息注释如果文本中不存在子串，索引将返回 0。 |
| count | 定义搜索出现的哪个 substring。例如，值为 2，则搜索第二次出现的。如果为负值，则从字符串的结尾开始。 |

示例：图表表达式

| 示例 | 结果 |
| --- | --- |
| `Index( 'abcdefg', 'cd' )` | 返回 `3` |
| `Index(  'abcdabcd', 'b', 2 )` | 返回 `6`（`b` 第二次出现） |
| `Index( 'abcdabcd', 'b',-2 )` | 返回 `2`（`b` 从结尾开始第二次出现） |
| `Left( Date, Index( Date,'-') -1` ) where `Date = 1997-07-14` | 返回 `1997` |
| `Mid( Date, Index( Date, '-', 2 ) -2, 2 )` where `Date` = `1997-07-14` | 返回 `07` |
| `Index( 'abc', 'x' )` | 返回 `0`（`abc` 字符串中不存在 `x`）。 |
| `Index( 'abc', 'a', 2 )` | 返回 `0`（`a` 没有第二次出现）。 |

## 示例 - 索引基本原理

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

#### 图表表达式

概述

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

加载脚本包含：

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

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

加载脚本

```
Example:
Load * inline [
InputString
abcdefg
abcdabcd ];
```

结果

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

* ` InputString
                                   `

创建以下计算维度：

* `=Index(InputString, 'cd')`

* `=Index(InputString, 'e')`

* `=Index(InputString, 'b', -1)`

结果表

| InputString | Index(InputString, 'cd') | Index(InputString, 'e') | Index(InputString, 'b', -1) |
| --- | --- | --- | --- |
| abcdabcd | 3 | 0 | 6 |
| abcdefg | 3 | 5 | 2 |

带字符串 `abcdabcd` 的第一行，返回：

* `3` - 第一次出现 `cd`

* `0` - 因为在字符串中找不到 `e`

* `6` - 从字符串末尾开始第一次出现 `b`

带字符串 `abcdefg` 的第二行，返回：

* `3` - 第一次出现 `cd`

* `5` - 第一次出现 `e`

* `2` - 从字符串末尾开始第一次出现 `b`

信息注释负 `count` 参数反向扫描字符串。然而，即使反向扫描，返回的位置也总是从左向右表示。

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

#### 加载脚本

以下代码显示了如何在加载脚本中使用该函数。

```
Example:
Load
*,
index(String, 'cd') as Index_CD,               // returns 3  in Index_CD
index(String, 'b') as Index_B,                // returns 2 in Index_B
index(String, 'b', -1) as Index_B2;           // returns 2 or 6 in Index_B2
Load * inline [
String
abcdefg
abcdabcd ];
```

结果表

| 字符串 | Index\_CD | Index\_B | Index\_B2 |
| --- | --- | --- | --- |
| abcdefg | 3 | 2 | 2 |
| abcdabcd | 3 | 2 | 6 |

## 示例 – Index 场景

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

#### 图表表达式

概述

客户支持中心有一个数据集，其中包含客户电子邮件的主题行。支持中心希望根据主题行中出现的关键字对这些电子邮件进行分类，例如 `Refund`、`Complaint` 和 `Technical Issue`。主题行存储在数据集中名为 `EmailSubject` 的字段中。

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

加载脚本包含：

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

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

加载脚本

```
Example:
Load * inline [
EmailSubject
Request for a Refund - Order 12345
Technical Issue with Product XYZ
Complaint about delivery service
Follow-up on Refund Request
Technical Issue not resolved
];
```

结果

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

* ` EmailSubject
                                   `

创建以下计算维度：

* `=If(Index(EmailSubject, 'Refund') > 0, 'Refund', 'Other')`，用来计算哪些电子邮件主题文本与退款有关。

结果

| EmailSubject | If(Index(EmailSubject, 'Refund') &gt; 0, 'Refund', 'Other') |
| --- | --- |
| Complaint about delivery service | 其他 |
| Follow-up on Refund Request | Refund |
| Request for a Refund - Order 12345 | Refund |
| Technical Issue not resolved | 其他 |
| Technical Issue with Product XYZ | 其他 |

`Index` 函数的输出已成功识别出包含字符串 `Refund` 的所有主题行。这是一个如何使用嵌套函数分析和分类数据并向用户传递值的示例。