使用 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,所以我有点时间压力,可能在这里遗漏了一些非常明显的东西。
编辑: 添加一些示例数据只是为了提供一些额外的见解。将在几个小时内测试这些建议,但看起来已经很有希望了!
链接的 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 } }
我目前正在努力使用 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,所以我有点时间压力,可能在这里遗漏了一些非常明显的东西。
编辑: 添加一些示例数据只是为了提供一些额外的见解。将在几个小时内测试这些建议,但看起来已经很有希望了!
链接的 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 } }