Оператор 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 |
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по