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

标签 powershell

我目前正在努力使用 PowerShell 扩展嵌入 CSV 表某一特定列中的 JSON。我把问题总结如下,也许有人可以帮忙。

问题:

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

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

但是,列“AuditData”本身包含 JSON 格式的条目,我想扩展这些条目,然后将其作为新列添加到表中,导致表更改为“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

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

{"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":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dba9b4b9bea9af9bb8b4b6abbab5a2f5b8b4b6" rel="noreferrer noopener nofollow">[email protected]</a>","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":"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="88fae7eaedfafcc8ebe7e5f8e9e6f1a6ebe7e5" rel="noreferrer noopener nofollow">[email protected]</a>","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为此(请参阅 Example 11: Create calculated properties for each InputObject ):

以表达式的形式:

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

或者以哈希表的形式:

$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 - 使用 PowerShell 展开嵌入 CSV 列中的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72097638/

相关文章:

excel - 加快在 Powershell 中读取 Excel 文件

windows - 无法在 cmd、Powershell 或 Vscode 中创建或更新文件。但我可以通过 Sublime、git bash 和文件资源管理器

powershell - Powershell选择类窗口事件/可见

c# - 为什么在 c# 中通过启动进程运行 powershell 时不导入 powershell 模块?

.net - 如何模块化powershell脚本

robocopy 退出代码的 Powershell 按位比较

regex - Powershell替换中可能存在错误,还是我做错了?

Powershell - Sharepoint 自动文件上传返回 "The remote server returned an error: (403) Forbidden."错误

powershell - 我怎样才能把这个PowerShell脚本写成一行

powershell - 无需等待即可复制项目