【问题标题】:Parse/Extract JSON data in CSV file解析/提取 CSV 文件中的 JSON 数据
【发布时间】:2020-03-08 10:11:24
【问题描述】:

我在 CSV 文件中有数百行,同时包含如下所示的 JSON 数据。下面是每一行的示例。

{"Id":"value","RecordType":"value","CreationTime":"value","Operation":"value"}

我尝试将其转换为 CSV,如下所示,但到目前为止没有运气。

CSV 文件的预期格式:

id RecordType CreationTime 操作 价值价值价值价值
$properties = @('Id', 'RecordType', 'CreationTime', 'Operation')
(Get-Content -Path-to_CSVfile -Raw | ConvertFrom-Json) |
    Select-Object -Property $properties |
    Export-Csv -NoTypeInformation -Path $path-to-new-csv-file

如果有人对此有任何想法,请帮助我。我尝试了ConvertTo-Json,但失败并出现错误:

ConvertFrom-Json:无效的 JSON 原语:“id”

这是前两行 CSV 数据。

{"Id":"ac325bc9-97f0-4b29-8fc4-90b80b945f6c","RecordType":20,"CreationTime":"2019-09-14T08:07:22","Operation":"AnalyzedByExternalApplication","OrganizationId" :"f38a5ecd-2813-4862-b11b-ac1d563c806f","UserType":0,"UserKey":"3fee8456-6d20-4794-8219-5a7c381e965f","工作负载":"PowerBI","UserId":"abcd@ mail.com","ClientIP":"000.000.50.177","UserAgent":"MSOLAP 15.0 Client","Activity":"AnalyzedByExternalApplication","ItemName":"Other","DatasetName":"XYZ Driven Company" ,"ObjectId":"Other","IsSuccess":true,"RequestId":"6836be8e-6e97-4bc9-a838-bf6e7b71e0c8","ActivityId":"7E92AE6A-F548-448D-93A8-6F5736DEA085"} {"Id":"3a20c8a9-ef44-483a-b9c0-43e10deae9ae","RecordType":20,"CreationTime":"2019-09-14T08:07:20","Operation":"AnalyzedByExternalApplication","OrganizationId" :"f38a5ecd-2813-4862-b11b-ac1d563c806f","UserType":0,"UserKey":"3fee8456-6d20-4794-8219-5a7c381e965f","工作负载":"PowerBI","UserId":"abcd@ mail.com","ClientIP":"000.000.50.177","UserAgent":"MSOLAP 15.0 Client","Activity":"AnalyzedByExternalApplication","ItemName":"Other","DatasetName":"XYZ Driven Company" ,"ObjectId":"Other","IsSuccess":true,"RequestId":"02e5d772-057b-45b6-ae60-22b7fa610f98","ActivityId":"7E92AE6A-F548-448D-93A8-6F5736DEA085"}

我正在另一个 CSV 文件中查看这些数据,如下所示。 ":" 之后的每个值都应作为行插入 CSV。

Id RecordType CreationTime Operation OrganizationId UserType UserKey Workload UserId ClientIP UserAgent Activity ItemName DatasetName ObjectId IsSuccess RequestId ActivityId AC325BC9-97F4-90B29-8FC4-90B80B945F6C 20 2019-09-14T08:07:22分析了externalApplication F38A5CD-2813-4862-B11B-AC1D563C806F 0 3FEE8456-6D20-4794-8219- 5A7C381E965F PowerBI ABCD@mail.com 000.000.50.177 MSOLAP 15.0 Client AnalyzedByExternalApplication Other xyz Driven Company Other TRUE 6836be8e-6e97-4bc9-a838-bf6e7b71e0c8 7E92AE6A-F548-448D-93A8-6F5736DEA085 3a20c8a9-ef44-483a-b9c0-43e10deae9ae 20 2019-09-14T08:07:20分析了externalApplication F38A5CD-2813-4862-B11B-AC1D563C806F 0 3FEE8456-6D20-4794-8219-5A7C381E965F PowerBI ABCD@mail.com 000.000.50.177 MSOLAP 15.0 Client AnalyzedByExternalApplication Other XYZ Driven Company Other TRUE 02e5d772-057b-45b6-ae60-22b7fa610f98 7E92AE6A-F548-448D-93A8-6F5736DEA085

在文本编辑器中打开 CSV 时更正数据。

"{""Id"":""ac325bc9-97f0-4b29-8fc4-90b80b945f6c"",""RecordType"":20,""CreationTime"":""2019-09-14T08:07:22 "",""Operation"":""AnalyzedByExternalApplication"",""OrganizationId"":""f38a5ecd-2813-4862-b11b-ac1d563abchrf"",""UserType"":0,""UserKey"":" "3fee8456-6d20-4794-8219-5a7c38abcdfe"",""工作负载"":""Pxyswer"",""UserId"":""abcd@mail.com"",""ClientIP"":""123.456 .50.177"",""UserAgent"":""MSOLAP 15.0 客户端"",""Activity"":""AnalyzedByExternalApplication"",""ItemName"":""Other"",""DatasetName"":" "ABCD 驱动公司"",""ObjectId"":""Other"",""IsSuccess"":true,""RequestId"":""6836be8e-6e97-4bc9-a838-bf6e7b71e0c8"",""ActivityId "":""7E92AE6A-F548-448D-93A8-6F5736DEA085""}"

【问题讨论】:

  • 请发布引发错误的完整代码(包括您如何导入 csv)
  • 您根本无效,请尝试在线 json 验证器(例如:jsonformatter.curiousconcept.com)并检查/更正您的 json。
  • 您的数据、代码和错误信息不匹配。请创建一个minimal reproducible example,测试运行 that 代码以确保它仍然显示您正在尝试调试的行为,然后edit 您的问题并复制/粘贴 that i> 代码以及具有代表性的示例数据以及 那个 代码引发的完整错误。不要在 cmets 中发布代码,因为那是不可读的。
  • 我在这里粘贴了示例数据,因为我无法粘贴所有内容以及我用来将 CSV 中的 JSON 转换为 CSV 中的列的代码。
  • 您发布的示例数据会给出与您显示的错误不同的错误,如果您确实按照我给您的说明进行操作,您就会清楚这一点。我已经将您之前评论中的代码添加到问题中。无需再次添加。

标签: json powershell csv


【解决方案1】:

如果您的输入文件仅包含单个示例数据行,则您发布的代码将起作用。如果输入文件包含多个这样的语句,您的代码将无法工作,因为它是无效的 JSON 数据。

有效的 JSON:

{"Id":"value","RecordType":"value","CreationTime":"value","Operation":"value"}

有效的 JSON:

[
{"Id":"value","RecordType":"value","CreationTime":"value","Operation":"value"},
{"Id":"value","RecordType":"value","CreationTime":"value","Operation":"value"}
]

无效的 JSON:

{"Id":"value","RecordType":"value","CreationTime":"value","Operation":"value"}
{"Id":"value","RecordType":"value","CreationTime":"value","Operation":"value"}

要转换后一种输入数据,您需要将每一行转换为单独的 JSON 文档:

$properties = 'Id', 'RecordType', 'CreationTime', 'Operation'
Get-Content 'C:\path\to\input.csv' |
    ConvertFrom-Json |
    Select-Object $properties |
    Export-Csv 'C:\path\to\output.csv' -NoType

要导出除特定字段之外的所有输入字段,您需要定义要排除的属性而不是要包含的属性:

$exclude = 'foo', 'bar'
Get-Content 'C:\path\to\input.csv' |
    ConvertFrom-Json |
    Select-Object -Properties * -Exclude $exclude |
    Export-Csv 'C:\path\to\output.csv' -NoType

编辑:

显然您的输入文件是一个只有一列且没有标题的 CSV,因此您可以通过Import-Csv 导入它,但您需要自己指定列标题。展开该字段以获取各个 JSON 值,然后按照上述步骤进行操作。

$properties = 'Id', 'RecordType', 'CreationTime', 'Operation'
Import-Csv 'C:\path\to\input.csv' -Header foo |
    Select-Object -Expand foo |
    ConvertFrom-Json |
    Select-Object $properties |
    Export-Csv 'C:\path\to\output.csv' -NoType

如果您希望导出所有 JSON 值,只需省略 Select-Object $properties 步骤即可。

【讨论】:

  • 感谢您的更新。如果有任何问题,我会尝试并回复。
  • 不幸的是,CSV 中的数据不是您提到的格式。而只是这样。我刚刚发布了几行,但文件在 CSV {"Id":" 中包含数百行这样的行value","RecordType":"value","CreationTime":"value","Operation":"value"} {"Id":"value","RecordType":"value","CreationTime":"value ","操作":"值"}
  • 这里是关于小数据的更多细节。csv文件的“AuditData”列包含以下数据{“Id”:“value”,“RecordType”:value,“CreationTime”:“value” ,"Operation":"value","OrganizationId":"value","UserType":value,"UserKey":"value","Workload":"value","UserId":"value","ClientIP" :"value","UserAgent":"value","Activity":"value","ItemName":"value","DatasetName":"value","ObjectId":"Other","IsSuccess":value ,"RequestId":"value"} 我希望删除该 Auditdata 作为列名,并将每个属性列和值作为其对应的值,如下面的另一个 csv 文件中
  • @AnilKumar 看,除非您提供输入数据的代表性样本,否则我无法帮助您。一个真正反映输入文件结构的文件,而不仅仅是单个字段的单个值。编辑您的问题。
  • @AnilKumar 您上一条评论中的错误消息清楚地表明您的输入数据不是您声称的那样。请在文本编辑器中打开输入文件,然后将该文件的前 3 行复制/粘贴到您的问题中。
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多