m / PowerQuery: как преобразовать столбец таблицы в читаемый текстовый столбец? - PullRequest
2 голосов
/ 09 апреля 2019

Я имею дело с журналом аудита PowerShell, который я импортировал из дампа XML.

Каждая строка представляет собой событие PowerShell, включая различные поля, такие как:

  • Attribute:Cmdlet (имя команды, которая была выполнена)
  • Attribute:Caller (имя пользователя администратора, выполнившего команду)
  • CmdletParameters.Parameter (входные параметры, которые были предоставлены для команды)

enter image description here

Как видно из скриншота, CmdletParameters.Parameter - это столбец таблицы.
Это столбец, который я пытаюсь расширить.

Каждое событие PowerShell может иметь неограниченное количество параметров.
(Максимум среди этого набора данных - 17 параметров для одного события.)

Например, вот команда с двумя параметрами:
Set-Mailbox -Identity Username1 -AccountDisabled FALSE

В этом примере в столбце таблицы CmdletParameters.Parameter будет две строки:

enter image description here

Я хотел бы создать два пользовательских столбца с именами ParameterNames и ParameterValues
В этом примере эти пользовательские столбцы будут содержать текст:

enter image description here

EDIT:
Комментатор запросил пример исходных данных XML.
Я включил две строки событий, с частной информацией отредактированной.

<?xml version="1.0" encoding="utf-16"?>
<SearchResults>
  <Event Caller="AdminUser1" Cmdlet="New-AdminAuditLogSearch" RunDate="2019-04-04T21:49:52+00:00" Succeeded="true" ObjectModified="ObjectUUID1" ExternalAccess="false" OriginatingServer="ServerName1 (IPAddress1)" ClientIP="[IPAddress2]:Port2">
    <CmdletParameters>
      <Parameter Name="StartDate" Value="4/3/2019 12:00:00 AM" />
      <Parameter Name="EndDate" Value="4/4/2019 12:00:00 AM" />
      <Parameter Name="ExternalAccess" Value="True" />
      <Parameter Name="StatusMailRecipients" Value="AdminUser1" />
      <Parameter Name="Name" Value="External admin audit log" />
    </CmdletParameters>
  </Event>
  <Event Caller="AdminUser2" Cmdlet="New-AdminAuditLogSearch" RunDate="2019-04-04T21:33:08+00:00" Succeeded="true" ObjectModified="ObjectUUID2" ExternalAccess="false" OriginatingServer="ServerName2 (IPAddress3)" SessionId="ObjectUUID3" ClientIP="[IPAddress4]:Port4">
    <CmdletParameters>
      <Parameter Name="StartDate" Value="4/3/2019 12:00:00 AM" />
      <Parameter Name="EndDate" Value="4/4/2019 12:00:00 AM" />
      <Parameter Name="StatusMailRecipients" Value="AdminUser2" />
    </CmdletParameters>
  </Event>
</SearchResults>

ДОПОЛНИТЕЛЬНЫЙ БОНУС:

Как я упоминал выше, в этом наборе данных может быть не более 17 параметров в строке.
Если бы мне нужно было также создать 17 столбцов для ParameterName1..ParameterName17, как я мог бы заполнить эти столбцы?
Легче ли сначала преобразовать столбец таблицы в один текстовый столбец, а затем проанализировать этот текст в отдельные столбцы?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Если ваше третье изображение является желаемым выходом, вы можете добиться этого, используя Text.Combine в пользовательском столбце.

Ниже приведен шаг Query, который нужно добавить для 2 столбцов

Add_Parameter_Names= Table.AddColumn(#"Previous Step", "ParameterNames", each Text.Combine([CmdletParameters.Parameter][Attribute:Name], ", "))
Add_Parameter_Values = Table.AddColumn(#"Add_Parameter_Names", "ParameterValues", each Text.Combine([CmdletParameters.Parameter][Attribute:Value], ", "))

Примечание: Если у вас есть null значения в столбцах Атрибут: Имя / Атрибут: Значение, я бы рекомендовал добавить условный столбец.

А что касается вашего бонусного вопроса, я думаю, вы можете решить это для себя, как только вы проверите этот вывод. Пожалуйста, прокомментируйте, если вам что-то нужно.

1 голос
/ 09 апреля 2019

Я думаю, что лучшим вариантом здесь было бы расширить эти таблицы параметров до новых строк, а затем развернуть столбец Attribute:Name.

Это можно сделать, просто нажав кнопки в графическом интерфейсе., но вот как выглядит код M:

let
    XMLTable = <XML Table Here>,
    #"Expanded CmdletParameters" = Table.ExpandTableColumn(XMLTable, "CmdletParameters", {"Parameter"}, {"Parameter"}),
    #"Expanded Parameter" = Table.ExpandTableColumn(#"Expanded CmdletParameters", "Parameter", {"Attribute:Name", "Attribute:Value"}, {"Attribute:Name", "Attribute:Value"}),
    #"Pivoted Column" = Table.Pivot(#"Expanded Parameter", List.Distinct(#"Expanded Parameter"[#"Attribute:Name"]), "Attribute:Name", "Attribute:Value")
in
    #"Pivoted Column"

Обратите внимание, что при повороте на Attribute:Name я выбираю Attribute:Value для столбца значений и не объединять в дополнительных параметрах.

Конечный результат должен выглядеть следующим образом (за исключением того, что я удалил некоторые другие Attribute: столбцы для наглядности.

Pivot Attributes

...