parse-where 연산자

문자열 식을 평가하고 해당 값을 하나 이상의 계산 열로 구문 분석합니다. 결과는 성공적으로 구문 분석된 문자열입니다.

parse-where 구문 분석과 동일한 방식으로 문자열을 구문 분석하고 성공적으로 구문 분석되지 않은 문자열을 필터링합니다.

구문 분석되지 않은 문자열에 대해 null을 생성하는 구문 분석 연산자를 참조하세요.

Syntax

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

구문 규칙에 대해 자세히 알아봅니다.

매개 변수

이름 형식 필수 설명
T string ✔️ 구문 분석할 테이블 형식 입력입니다.
kind string ✔️ 지원되는 종류 값 중 하나입니다. 기본값은 simple입니다.
regexFlags string kind가 이regex면 ungreedy, 다중 줄 모드s, m 일치하는 새 줄 \n및 대/소문자를 구분하지 않는 경우처럼 i 사용할 U regex 플래그를 지정할 수 있습니다. 플래그에서 더 많은 플래그를 찾을 수 있습니다.
expression string ✔️ 문자열로 계산되는 식입니다.
stringConstant string ✔️ 검색하고 구문 분석할 문자열 상수입니다.
columnName string ✔️ 문자열 식에서 추출된 값을 할당할 열의 이름입니다.
columnType string 값을 변환할 형식을 나타내는 스칼라 값입니다. 기본값은 string입니다.

참고

  • 일부 열을 삭제하거나 이름을 바꾸려면 프로젝트를 사용합니다.
  • 패턴에서 를 사용하여 * 정크 값을 건너뜁니다. 이 값은 열 다음에 string 사용할 수 없습니다.
  • 구문 분석 패턴은 StringConstant 외에도 ColumnName으로 시작할 수 있습니다.
  • 구문 분석된 이 형식이 아니면 형식 string으로 string변환됩니다.

지원되는 종류 값

텍스트 Description
simple 이것은 기본값입니다. stringConstant 는 일반 문자열 값이며 일치는 엄격합니다. 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하고, 모든 확장 열이 필요한 형식과 일치해야 합니다.
regex stringConstant 는 정규식일 수 있으며 일치는 엄격합니다. 이 모드에 대한 regex일 수 있는 모든 문자열 구분 기호가 구문 분석된 문자열에 표시되어야 하고, 모든 확장 열이 필요한 형식과 일치해야 합니다.

Regex 모드

regex 모드에서 구문 분석에서는 패턴을 regex로 변환하고 정규식을 사용하여 내부적으로 처리되는 번호가 매겨진 캡처된 그룹을 사용하여 일치를 수행합니다. 예를 들면 다음과 같습니다.

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

내부적으로 구문 분석에서 생성되는 regex는 입니다 .*?<regex1>(.*?)<regex2>(\-\d+).

  • *.*?로 변환되었습니다.
  • string.*?로 변환되었습니다.
  • long\-\d+로 변환되었습니다.

반환

연산자에 제공되는 열 목록에 따라 확장되는 입력 테이블입니다.

참고

성공적으로 구문 분석된 문자열만 출력에 있습니다. 패턴과 일치하지 않는 문자열은 필터링됩니다.

예제

parse-where 연산자는 동일한 string 식에서 여러 extract 애플리케이션을 사용하여 테이블을 extend(확장)하는 효율적인 방식을 제공합니다. 이는 테이블에 개별 열로 string 분할하려는 여러 값이 포함된 열이 있는 경우에 가장 유용합니다. 예를 들어 개발자 추적("printf/"Console.WriteLine") 문에 의해 생성된 열을 분리할 수 있습니다.

parse 사용

아래 예제에서 테이블 Traces 의 열 EventText 에는 형식Event: NotifySliceRelease (resourceName={0}, totalSlices= {1}, sliceNumber={2}, lockTime={3}, releaseTime={4}, previousLockTime={5})의 문자열이 포함됩니다. 아래 작업은 , lockTimeMonthtotalSlicessliceNumberreleaseTimepreviousLockTimeDay열 6개로 테이블을 확장합니다. resourceName

일부 문자열에는 전체 일치 항목이 없습니다.

를 사용하면 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 대/소문자를 구분하지 않는 정규식 플래그 사용

위의 쿼리에서 기본 모드는 대/소문자를 구분하므로 문자열이 성공적으로 구문 분석되었습니다. 결과를 얻지 못했습니다.

필요한 결과를 얻으려면 대/소문자를 구분하지 않는(i) 정규식 플래그를 사용하여 를 실행 parse-where 합니다.

세 개의 문자열만 성공적으로 구문 분석되므로 결과는 3개의 레코드입니다(일부 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