Power Query 추적 로그를 Power Query에서 구문 분석하려고했습니다.

Power Query 추적 로그를 구문 분석해 보았습니다. 그대로 바라봐도 왠지 보이는데 정리된 상태로 보이면 좋지요. 커뮤니티 이벤트에서 칠라 보여준 것을 후생 소중히 소금에 절여도 어쩔 수 없기 때문에 공개해 두자. 수행의 동행에도.

Power Query 있어요, 저것은 마법의 지팡이니까 수업하지 않고 사용할 수 있게 되지 않아요. htps // t. 코/9gy8g↑이 GQ #PowerBI #PowerQuery #PBIJP — Takeshi Kagata (@PowerBIxyz) 2019년 4월 4일

Power BI Desktop에 "쿼리 진단"기능이 추가되었습니다.
Power Query 편집기에서 진단 시작부터 종료, 구문 분석 된 파일 (JSON)에서 로그 등을 볼 수 있습니다


파서 본체



추적 로그 출력 대상은 [Power Query Editor] ⇒ [옵션 및 설정] ⇒ [진단]
트레이스 시작은 [트레이스 활성화]를 ON

분석, 리팩토링 등을 좋아합니다.
let
    Source = Folder.Contents(" <<  >> "),
    FilteredRows = Table.SelectRows(Source, each Text.Lower([Extension]) = ".log"),
    Content = List.Combine(List.Transform(FilteredRows[Content], Lines.FromBinary)),
    TableFromContent = Table.FromColumns({Content}, {"Value"}),
    SplitColumnByDelimiter1 = Table.SplitColumn(
        TableFromContent,
        "Value",
        Splitter.SplitTextByEachDelimiter(
            {":"},
            QuoteStyle.None,
            false
        ),
        {"Value.1", "Value.2"}
    ),
    SplitColumnByDelimiter2 = Table.SplitColumn(
        SplitColumnByDelimiter1,
        "Value.2",
        Splitter.SplitTextByEachDelimiter(
            {":"},
            QuoteStyle.None,
            false
        ),
        {"Value.2", "Value.3"}
    ),
    TryParseJSON = Table.TransformColumns(
        SplitColumnByDelimiter2,
        {
            "Value.3",
            each List.Last(
                List.Generate(
                    ()=>[SourceText = _, Condition = true, Limit = 0],
                    each [Condition] and [Limit] <= 5,
                    each [
                        Limit = [Limit] + 1,
                        _try = try Json.Document([SourceText]),
                        Condition = _try[HasError],
                        _field = Text.BetweenDelimiters(_try[Error][Message], "'", "'"),
                        _SourceText = Text.Split([SourceText], """" & _field & """"),
                        SourceText = Text.Combine(
                            List.Combine(
                                List.Zip(
                                    {
                                        _SourceText,
                                        List.Transform(
                                            {1 .. List.Count(_SourceText) - 1},
                                            each """" & _field & Text.From(_) & """"
                                        )
                                    }
                                )
                            )
                        )
                    ],
                    each [SourceText]
                )
            )
        }
    ),
    ParsedJSON = Table.TransformColumns(
        TryParseJSON,
        {"Value.3", Json.Document}
    ),
    RemovedErrors = Table.RemoveRowsWithErrors(ParsedJSON),
    // ここで展開するフィールドを調整
    ExpandedValue3 = Table.ExpandRecordColumn(
        RemovedErrors,
        "Value.3",
        {"Start", "Action", "Duration", "Message", "RequestUri"},
        {"Start", "Action", "Duration", "Message", "RequestUri"}
    ),
    ChangedType = Table.TransformColumnTypes(
        ExpandedValue3,
        {
            {"Start", type text},
            {"Action", type text},
            {"Duration", type text},
            {"Message", type text}
        }
    ),
    SortedRows = Table.Sort(ChangedType,{{"Start", Order.Ascending}}),
    AddedIndex = Table.AddIndexColumn(SortedRows, "Index", 1, 1)
in
    AddedIndex

거친 주석


  • Folder.Contents의 인수는 추적 로그를 출력하는 경로입니다. Folder.Files가 아니므로 하위 폴더의 파일을 볼 수 없습니다.
  • 파일 확장자 ".log"로 필터링하고 구문 분석하지 않는 파일을 제외합니다.
  • 각 로그 파일 (binary)에 대해 Lines.FromBinary에서 텍스트 (text)로 변환하면서 목록 (list)으로 만들고 List.Combine에서 하나의 목록 (list)으로 요약합니다.
  • 이 후 열 (column)의 분해 등하므로 테이블 (table)로 변환
  • 정리된 리스트의 아이템 마다 보았을 때, 구분자 ":"로 3개에 전개할 수 있을 것 같은 것을 알기 때문에, 아까에 두개 추출. 이 때, QuoteStyle.None으로 해 두지 않으면 곤란한 일이 발생한다.
  • 남은 마지막 열(column)을 보았을 때, 어쩌면 JSON ? 에서, Json.Document 로 퍼스 하면 Expression.Error 가 빈발. 조사 할 때 필드 이름이 겹치는 것으로 확인되었으므로 필드 이름을 이름 바꾸면서 Expression.Error가 발생하지 않을 때까지 List.Generate에서 반복합니다.
  • 대체로 JSON으로 퍼스 해도 문제없는 상태가 되었으므로 테이블(table)이 되도록 전개
  • 시계열로 정렬하고 색인을 붙여 둡니다

  • 생각했어요🙄



    Power BI Desktop 의 로그는 Excel 로, Excel 의 로그는 Power BI Desktop 로 바라보는 것이 편할지도.
    어디까지 세세하게 파악할 수 있을지는 모른다. 로그 체재는 언젠가 변화할지도 모르고다. 그렇지만, 어떻게 처리가 되는지 힌트를 얻는 것은 가능하지 않을까. Diagnostics.Trace에 대해 별도로 게시할까요?

    기타


  • Power BI 스터디 - connpass
  • Power BI Desktop을 사용하려면
  • Excel에서 Power Query를 사용하려면
  • 좋은 웹페이지 즐겨찾기