Powershell 将 JSON 转换为 csv 文件

问题描述 投票:0回答:4

我搜索了使用 Powershell 将复杂 json(嵌入数组] 转换为 csv 文件的示例。目标是接受 json 数据 到 MSAccess 数据库中。 MSAccess 不提供执行此操作的内部函数。我是 Powershell 和 json 的新手,但我确实发现了引起我兴趣的 ConvertFrom-JSON cmdlet。 我发现的最好的信息是

iRon 的 Flatten-Object 函数

回应这篇文章

PowerShell 将嵌套的 JSON 数组转换为 CSV 文件中的单独列

虽然此函数可以创建单个 csv,但如果 json 中有嵌入数组,我有兴趣创建多个 csv 文件。这个想法是为每个级别的数据创建一个 csv 文件。 2 级及更低级别将需要一个链接字段(id/name)用作 level1 中的主键,以及 level2 中的外键。 level2 的 PK 字段将作为 level3 的外键包含在内,依此类推。由于 Access 可以将 csv 数据导入到表中,因此我的感觉是,将数据导入“标准化”csv 文件将是一种将 json 数据导入 MSAccess 数据库的可重复方法。

因此,关于我的目标和扁平化对象功能,我正在寻找以下方面的建议/方向:

    功能可以调整/用来识别吗
  • json 文件中的级别,
  • 为每个级别创建一个 csv 可选择关联的 PK 字段
  • 以标准化方式导入 csv 数据文件到 MSAccess?
我确实意识到每个 json 文件都需要一些人为干预。因此,我正在寻找一种能够简化工作并且可重复的方法。

我创建了一个简单的脚本来获取一个简单的 json 文件(无嵌入数组)并将其转换为 CSV。我已经在vba中使用Shell命令来执行PS脚本了。

<#CarsBasic.ps1 .DESCRIPTION This script takes the cars.json file and reads it into memory Converts it from Json, then selects id,manufacturer,year from the result and exports the data to C:\Programs\CarsJack.csv as a csv file with header #> (Get-Content C:\Programs\MendipDataSystems\JSONParser\Files\Cars.json -Raw | ConvertFrom-Json) |Select id,manufacturer,year | Export-CSV c:\programs\CarsJack.csv -NoTypeInformation

提前致谢。

我根据 iRon 的请求/评论调整了这篇文章。

具有 Squad、SquadMember 和 SquadMemberPower 级别的示例 json 文件。我想要获得一个包含小队信息的 Squad.csv,一个包含小队名称和每个成员详细信息的 SquadMember.csv,以及一个包含 SquadName 和标识该 Power 所属人员的成员名称的 SquadmemberPower csv。实际上,这 3 个 csv 文件将作为 3 个标准化表加载到 MSAccess 中。 这是我的测试用例,但如果可能的话,我想要一种更通用、可重用的方法。这是 MultiSquad.json

[{ "squadName": "Super hero squad Alpha", "homeTown": "Metro City", "formed": 2016, "secretBase": "Large tent in the forest", "active": "True", "members": [{ "name": "Molecule Man", "age": 29, "secretIdentity": "Dan Jukes", "powers": ["Radiation resistance", "Turning tiny", "Radiation blast"] }, { "name": "Madame Uppercut", "age": 39, "secretIdentity": "Jane Wilson", "powers": ["Million tonne punch", "Damage resistance", "Superhuman reflexes"] }, { "name": "Eternal Flame", "age": 1000000, "secretIdentity": "Unknown", "powers": ["Immortality", "Heat Immunity", "Inferno", "Teleportation", "Interdimensional travel"] }] }, { "squadName": "Second squad Baker", "homeTown": "Metro Toronto", "formed": 2017, "secretBase": "CN tower", "active": "True", "members": [{ "name": "Kathleen Wynne", "age": 49, "secretIdentity": "Cyan Arrah", "powers": ["XRay vision", "Invisibility", "Radiation blast"] }, { "name": "Madame Butterfly", "age": 27, "secretIdentity": "Iman Angel", "powers": ["Magical hearing", "Fantastic ideas"] }, { "name": "Gassy Misty Cloud", "age": 1000, "secretIdentity": "Puff of Smoke", "powers": ["Immortality", "Heat and Flame Immunity", "Impeccable hearing", "Xray Vision", "Able to jump tall buildings", "Teleportation", "Intergalactic travel"] }] }]

预期输出:3 个 csv 文件

1) 带字段的 Squad.csv "小队名称","家乡","已组建","秘密基地","活跃"

2) 带字段的 SquadMembers.csv “小队名称”,“姓名”,“年龄”,“秘密身份”

3)带有字段的SquadMemberPowers.csv “名字”、“权力”

json powershell csv
4个回答
1
投票
具体解决方案

假设

$JSON

 包含您的 JSON 对象:

$Squads = @(); $SquadMembers = @(); $SquadMemberPowers = @() ForEach ($Squad In $JSON) { $Squads += New-Object PSObject ($Squad | Select squadName, homeTown, formed, secretBase, active) ForEach ($member In $Squad.members) { $SquadMembers += New-Object PSObject ($member | Select @{label = "squadName" ;expression = {$Squad.squadName}}, name, age, secretIdentity) ForEach ($power In $member.powers) { $SquadMemberPowers += New-Object PSObject ($member | Select @{label = "name" ;expression = {$member.name}}, @{label = "powers" ;expression = {$power}}) } } } $Squads | Export-CSV ".\Squad.csv" -NoTypeInformation $SquadMembers | Export-CSV ".\SquadMembers.csv" -NoTypeInformation $SquadMemberPowers | Export-CSV ".\SquadMemberPowers.csv" -NoTypeInformation

通用解决方案

关于通用(可重用)解决方案,我认为您的请求不够通用:在

members

 级别,您有一个包含要枚举的哈希表的数组,在 
powers
 级别,您喜欢转置数组,而不是想要从父级中获取一些不常见的属性(
squadname
 vs 
name
)。您可能会考虑在这里引用第一个属性,但 PowerShell 中的哈希表并不总是保持顺序,请参阅:
Powershell 哈希表键顺序)。 换句话说,对于通用解决方案,您将需要提供如此多的参数,以至于与上述特定脚本相比,不会有太多附加值,并且更改它是调整它的函数和变量。


1
投票
首先获取json到一个对象:

$obj = Get-Content C:/input.json | ConvertFrom-Json

那么您至少有两种方法来选择您想要的项目。

简单选择:

$obj | select squadName, homeTown, formed, secretBase, active | Convertto-csv > c:\squads.csv

复杂的选择:

$members = $obj | foreach { $squadName = $_.squadName $_.members | foreach { [pscustomobject]@{ squadName = $squadName name = $_.name age = $_.age secretIdentity = $_.secretIdentity } } } $members | ConvertTo-Csv > c:\members.csv $powers = $obj.members | foreach { $memberName = $_.name $_.powers | foreach { [pscustomobject]@{ name = $memberName power = $_ } } } $powers | ConvertTo-Csv > c:\powers.csv
    

0
投票
以下命令可用于将 csv 数据分隔成带有分隔符“,”的列。

例如: Import-Csv "C:\Result.csv" - 分隔符 "," |排序对象 _from -唯一 |导出-csv“C:\FINAL_REPORT.csv”


0
投票
Sub JSONtoCSV() Dim JsonText As String Dim JsonObject As Object Dim FSO As Object Dim JsonFile As Object Dim key As Variant Dim item As Object Dim row As Long Dim col As Long Dim headers As New Collection Dim header As Variant Dim ws As Worksheet ' Set the worksheet where data will be written Set ws = ThisWorkbook.Sheets("Sheet1") ' Change to your sheet name ' Read JSON file Set FSO = CreateObject("Scripting.FileSystemObject") Set JsonFile = FSO.OpenTextFile("C:\path\to\your\file.json", 1) ' 1 = ForReading JsonText = JsonFile.ReadAll JsonFile.Close ' Parse JSON Set JsonObject = JsonConverter.ParseJson(JsonText) ' Initialize row and column counters row = 1 col = 1 ' Get headers from the first JSON object For Each item In JsonObject For Each key In item.Keys On Error Resume Next headers.Add key, key On Error GoTo 0 Next key Next item ' Write headers to Excel sheet For Each header In headers ws.Cells(row, col).Value = header col = col + 1 Next header ' Reset column counter and increment row counter col = 1 row = row + 1 ' Write data to Excel sheet For Each item In JsonObject For Each header In headers If item.Exists(header) Then ws.Cells(row, col).Value = item(header) Else ws.Cells(row, col).Value = "" End If col = col + 1 Next header col = 1 row = row + 1 Next item ' Autofit columns for better visibility ws.Columns.AutoFit MsgBox "JSON data has been imported to Excel."
结束子

© www.soinside.com 2019 - 2024. All rights reserved.