Оператор parse-where

Вычисляет строковое выражение и анализирует его значение в один или несколько вычисляемых столбцов. Результатом являются только успешно проанализированные строки.

parse-where анализирует строки так же, как и синтаксический анализ, и отфильтровывает строки, которые не были успешно проанализированы.

См . оператор синтаксического анализа, который создает значения NULL для неудачно проанализированных строк.

Синтаксис

T| parse-where [kind=kind [flags=regexFlags]] expressionwith* (stringConstantcolumnName [:columnType]) *...

Дополнительные сведения о соглашениях о синтаксисе.

Параметры

Имя Тип Обязательно Описание
T string ✔️ Табличные входные данные для анализа.
kind string ✔️ Одно из поддерживаемых значений типа. Значение по умолчанию — simple.
regexFlags string Если тип имеет значение regex, можно указать флаги регулярных выражений, которые будут использоваться, например U , для ungreedy, m для многострочный режим, s для соответствия новой строке \nи i для без учета регистра. Дополнительные флаги можно найти в разделе Флаги.
expression string ✔️ Выражение, результатом которого является строка.
stringConstant string ✔️ Строковая константа, для которой выполняется поиск и анализ.
columnName string ✔️ Имя столбца, для назначения значения, извлеченное из строкового выражения.
columnType string Скалярное значение, указывающее тип, в который необходимо преобразовать значение. Значение по умолчанию — string.

Примечание

  • Используйте проект , если вы также хотите удалить или переименовать некоторые столбцы.
  • Используйте * в шаблоне для пропуска нежелательных значений. Это значение нельзя использовать после string столбца.
  • Шаблон синтаксического анализа может начинаться с ColumnName в дополнение к StringConstant.
  • Если проанализированное выражение не является типом string, оно будет преобразовано в тип string.

Поддерживаемые значения типа

текст Описание
simple Это значение по умолчанию. stringConstant — это обычное строковое значение, а соответствие строгое. Все строковые разделители должны присутствовать в проанализированной строке, и все расширенные столбцы должны соответствовать требуемым типам.
regex StringConstant может быть регулярным выражением, а соответствие строгое. Все строковые разделители, которые могут быть регулярными выражениями при использовании этого режима, должны присутствовать в проанализированной строке, и все расширенные столбцы должны соответствовать требуемым типам.

Режим регулярных выражений

В режиме регулярных выражений синтаксический анализ преобразует шаблон в регулярное выражение и использует регулярные выражения для сопоставления с помощью нумерованных отслеживаемых групп, обрабатываемых внутри организации. Пример:

parse-where kind=regex Col with * <regex1> var1:string <regex2> var2:long

Регулярное выражение, которое будет создаваться при внутреннем анализе, — ..*?<regex1>(.*?)<regex2>(\-\d+)

  • * преобразовано в .*?.
  • string преобразовано в .*?.
  • long преобразовано в \-\d+.

Возвращаемое значение

Входная таблица, расширенная в соответствии со списком столбцов, предоставленных оператору.

Примечание

В выходных данных будут только успешно проанализированные строки. Строки, которые не соответствуют шаблону, будут отфильтрованы.

Примеры

Оператор parse-where предоставляет упрощенный способ использования extend для таблицы путем применения нескольких операторов extract в одном выражении string. Это наиболее полезно, если в таблице есть string столбец, содержащий несколько значений, которые необходимо разбить на отдельные столбцы. Например, можно разбить столбец, созданный инструкцией трассировки разработчика ("printf/").Console.WriteLine

Использование parse

В приведенном ниже примере столбец EventText таблицы Traces содержит строки формы Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5}). Следующая операция расширит таблицу шестью столбцами: resourceName , totalSlices, sliceNumber, lockTime, releaseTime, previousLockTime, Monthи Day.

Некоторые строки не имеют полного соответствия.

При использовании parseвычисляемые столбцы будут иметь значения NULL.

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previouLockTime: date ")" *  
| project
    resourceName,
    totalSlices,
    sliceNumber,
    lockTime,
    releaseTime,
    previouLockTime

Выходные данные

resourceName totalSlices sliceNumber lockTime releaseTime previousLockTime
PipelineScheduler 27 20 02/17/2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 22 02/17/2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Использование parse-where

Использование parse-where будет отфильтровывать неудачно проанализированные строки из результата.

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=invalid_number, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=invalid_datetime, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=invalid_number, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces  
| parse-where EventText with * "resourceName=" resourceName ", totalSlices=" totalSlices: long * "sliceNumber=" sliceNumber: long * "lockTime=" lockTime ", releaseTime=" releaseTime: date "," * "previousLockTime=" previousLockTime: date ")" *  
| project
    resourceName,
    totalSlices,
    sliceNumber,
    lockTime,
    releaseTime,
    previousLockTime

Выходные данные

resourceName totalSlices sliceNumber lockTime releaseTime previousLockTime
PipelineScheduler 27 20 02/17/2016 08:40:01 2016-02-17 08:40:01.0000000 2016-02-17 08:39:01.0000000
PipelineScheduler 27 22 02/17/2016 08:41:01 2016-02-17 08:41:00.0000000 2016-02-17 08:40:01.0000000

Режим регулярного выражения с использованием флагов регулярных выражений

Чтобы получить resourceName и totalSlices, используйте следующий запрос:

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices

Выходные данные

resourceName totalSlices

parse-where с флагом регулярного выражения без учета регистра

В приведенном выше запросе режим по умолчанию учитывал регистр, поэтому строки были успешно проанализированы. Результат не получен.

Чтобы получить необходимый результат, выполните команду parse-where с флагом регулярного выражения без учета регистра (i).

Только три строки будут успешно проанализированы, поэтому результатом будет три записи (некоторые totalSlices содержат недопустимые целые числа).

let Traces = datatable(EventText: string)
    [
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=11, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00, releaseTime=02/17/2016 08:40:00, previousLockTime=02/17/2016 08:39:00)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=non_valid_integer, sliceNumber=44, lockTime=02/17/2016 08:40:01, releaseTime=02/17/2016 08:40:01, previousLockTime=02/17/2016 08:39:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:01)",
    "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00, releaseTime=02/17/2016 08:41:00, previousLockTime=02/17/2016 08:40:00)"
];
Traces
| parse-where kind = regex flags=i EventText with * "RESOURCENAME=" resourceName "," * "totalSlices=" totalSlices: long "," *
| project resourceName, totalSlices

Выходные данные

resourceName totalSlices
PipelineScheduler 27
PipelineScheduler 27
PipelineScheduler 27