使用 PowerShell 展开嵌入在 CSV 列中的 JSON

Expand JSON embedded in CSV column using PowerShell

我目前正在努力使用 PowerShell 扩展嵌入在 CSV table 的一个特定列中的 JSON。我总结了下面的问题,也许你们中的一些人可以提供帮助。

问题:

我编写了一个脚本来将日志文件从数据源导出到 CSV 文件中。 CSV 包含一组列。在某些情况下,我想减少 CSV 的列数并扩展 CSV 中嵌入的任何 JSON,以便我可以对文件执行其他处理步骤。仅选择我可以使用的相关列:

$csvFile = Import-Csv -Path $filePath -Delimiter ","
$csvFileCompact = $csvFile | Select-Object -Property CreationDate, UserIds, Operations, AuditData

但是,“AuditData”列本身包含 JSON 格式的条目,我想展开这些条目,然后将其作为新列添加到 Table导致 table 更改为“CreationDate, UserIDs, Operations, AuditData_1, AuditData_2, ...” AuditData_1, AuditData_2 等被扩展JSON 个条目。

我尝试使用 ConvertFrom-JSON 并以多种方式访问​​对象数据 ($obj | Select -ExpandProperty "SomeProp")$obj."SomeProp" 以将其应用于“AuditData”,但似乎遗漏了一些内容。由于突然的“需求”,我昨天才开始玩 PowerShell,所以我有点时间压力,可能在这里遗漏了一些非常明显的东西。

编辑: 添加一些示例数据只是为了提供一些额外的见解。将在几个小时内测试这些建议,但看起来已经很有希望了!

https://easyupload.io/376oki

链接的 CSV 中嵌入了以下 JSON:

{"CreationTime":"2022-04-06T18:56:16","Id":"abc","Operation":"Update","OrganizationId":"abcd","RecordType":2,"ResultStatus":"Succeeded","UserKey":"1000000","UserType":0,"Version":1,"Workload":"Exchange","ClientIP":"2000:0000:000:000:abcd::d","UserId":"robert@company.com","AppId":"abcde","ClientAppId":"abcdef","ClientIPAddress":"2000:0000:000:000:aaaa::d","ClientInfoString":"Client=REST;Client=RESTSystem;;","ClientRequestId":"abcd","ExternalAccess":false,"InternalLogonType":0,"LogonType":0,"LogonUserSid":"S-1","MailboxGuid":"abcdefg","MailboxOwnerSid":"S-2","MailboxOwnerUPN":"robert@company.com","OrganizationName":"company.onmicrosoft.com","OriginatingServer":"V (10.00.0000.000)\r\n","Item":{"Attachments":" (10000b)","Id":"0000","InternetMessageId":"<000000.eurprd09.prod.outlook.com>","IsRecord":false,"ParentFolder":{"Id":"000001234","Path":"\Calendar\Person"},"SizeInBytes":123456,"Subject":"Hi"},"ModifiedProperties":["AttachmentCollection","HtmlBody","CreationTime"]}

您可以使用 Select-Object calculated property for this (see Example 11: Create calculated properties for each InputObject):

表达式形式:

$Object = $csvFile | Select-Object -Property CreationDate, UserIds, Operations,
    { $_.AuditData |ConvertFrom-Json }

或者以散列的形式table:

$Object = $csvFile | Select-Object -Property CreationDate, UserIds, Operations,
    @{ name = AuditData; Expression = { $_.AuditData |ConvertFrom-Json } }

从这里您可以进一步深入了解 json 对象属性,例如:

$Object.AuditData.SomeProp

您还可以考虑根据 $Object 的 json(子)属性创建一个新的计算 属性:

$Object |Select-Object -Property CreationDate, UserIds, Operations, AuditData,
    @{ name = SomeProp; Expression = { $_.AuditData.SomeProp } }