# SubField — функция скриптa и диаграммы

SubField() используется для извлечения компонентов подстроки из поля родительской строки, где поля исходной записи состоят из двух или более частей, разделенных знаком разделителя.

Функцию Subfield() можно использовать, например для извлечения имени или фамилии из списка записей, состоящего из полных имен, отдельных частей имени пути или для извлечения данных из таблиц с данными, разделенными запятыми.

Если используется функция Subfield() в операторе LOAD и дополнительный параметр field\_no не указан, для каждой подстроки будет создана одна полная запись. Если с помощью функции Subfield() загружено несколько полей, будет создано декартово произведение всех возможных комбинаций.

Синтаксис:

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

Возвращаемые типы данных: string

Аргументы

| Аргумент | Описание |
| --- | --- |
| 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()` извлекает первую подстроку из `Name`, задавая аргументу `field_no` значение 1. Так как `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` извлекает первую подстроку из `Name`, задавая аргументу `field_no` значение 1. Так как `field_no` имеет положительное значение, при извлечении подстроки соблюдается порядок «слева направо». Второй вызов функции извлекает вторую подстроку, задавая аргументу `field_no` значение -1, при этом соблюдается порядок «справа налево».

## Пример. Сценарий использования SubField

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

#### Выражение диаграммы

Обзор

Набор данных о продуктах содержит таблицу продуктов. Каждый продукт в таблице имеет поле тега, которое идентифицирует область продукта. Продукты могут иметь несколько значений для поля тега. Например, для продукта Widget A указаны следующие теги: Electronics, Gadgets, Home. Значения тегов разделяются символом «прямая черта» (|). В этом примере показано, как извлечь конкретные значения тегов с помощью функции `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 создать декартово произведение всех возможных комбинаций. Параметр DISTINCT используется, чтобы не допустить создания дубликатов записей.