【问题标题】:Powershell ConvertFrom-Json Loop Through Multiple Files to Output to CSVPowershell ConvertFrom-Json 循环遍历多个文件输出到 CSV
【发布时间】:2021-08-26 00:09:59
【问题描述】:

我有一个包含几十个 json 文件的文件夹,我通过 powershell 输出到 csv。所有 json 文件具有相同的格式。我当前的 powershell 脚本是通过文件名一个一个地定义每个文件,选择各种值并将其输出到同一个 csv。

如何修改 powershell 脚本,以便它简单地遍历文件夹中的每个文件,而不必通过文件名专门定义每个文件?

每个json的内容是这样的:

   {
      "ItemName": "A",
      "ItemID": "I001",
      "ItemDate": "2021-03-01",
      "ItemValue": "1000",
      "ItemTags": [
         {
            "Name": "Tag 1",
            "Value": "medium"
         },
         {
            "Name": "Tag 2",
            "Value": "red"
         },
         {
            "Name": "Tag 3",
            "Value": null
         },
         {
            "Name": "Tag 4",
            "Value": "Yes"
         }
      ]
   },
   {
      "ItemName": "B",
      "ItemID": "I002",
      "ItemDate": "2021-02-01",
      "ItemValue": "3000",
      "ItemTags": [
         {
            "Name": "Tag 1",
            "Value": "best"
         },
         {
            "Name": "Tag 2",
            "Value": "green"
         },
         {
            "Name": "Tag 3",
            "Value": null
         },
         {
            "Name": "Tag 4",
            "Value": "No"
         }
      ]

这是一个 powershell 示例。如何修改它,以便通过 C:\temp 文件夹并对每个文件执行相同的输出,而无需使用文件名指定 -Path 部分?

$obj1 = Get-Content -Path "C:\Temp\sample1.json"  | ConvertFrom-Json
$obj1 | select ItemName, ItemID, ItemDate, ItemValue, @{Name = 'Tag 4'; Expression ={($_.itemtags | where-object Name -eq "Tag 4").Value}} | Export-CSV "C:\Temp\items.csv" -NoTypeInformation -Append

$obj2 = Get-Content -Path "C:\Temp\sample2.json"  | ConvertFrom-Json
$obj2 | select ItemName, ItemID, ItemDate, ItemValue, @{Name = 'Tag 4'; Expression ={($_.itemtags | where-object Name -eq "Tag 4").Value}} | Export-CSV "C:\Temp\items.csv" -NoTypeInformation -Append

$obj3 = Get-Content -Path "C:\Temp\sample3.json"  | ConvertFrom-Json
$obj3 | select ItemName, ItemID, ItemDate, ItemValue, @{Name = 'Tag 4'; Expression ={($_.itemtags | where-object Name -eq "Tag 4").Value}} | Export-CSV "C:\Temp\items.csv" -NoTypeInformation -Append

【问题讨论】:

    标签: json powershell csv


    【解决方案1】:

    试试这个:

    $properties = @(
        'ItemName', 'ItemID', 'ItemDate'
        'ItemValue', @{
            Name = 'Tag 4'
            Expression = {
                ($_.itemtags | Where-Object Name -eq "Tag 4").Value
            }
        }
    )
    
    Get-ChildItem "C:\Temp" -File -Filter *.json | ForEach-Object {
        Get-Content $_ -Raw | ConvertFrom-Json |
        Select-Object $properties
    } | Export-CSV "C:\Temp\items.csv" -NoTypeInformation
    

    编辑

    我从您的示例中复制了 JSON,如果所有 JSON 看起来都像这样,请告诉我,我将编辑我的代码。

    PS \> $json[0]
    
    ItemName  : A
    ItemID    : I001
    ItemDate  : 2021-03-01
    ItemValue : 1000
    ItemTags  : {@{Name=Tag 1; Value=medium}, @{Name=Tag 2; Value=red}, @{Name=Tag 3; Value=}, @{Name=Tag 4; Value=Yes}}
    
    ItemName  : B
    ItemID    : I002
    ItemDate  : 2021-02-01
    ItemValue : 3000
    ItemTags  : {@{Name=Tag 1; Value=best}, @{Name=Tag 2; Value=green}, @{Name=Tag 3; Value=}, @{Name=Tag 4; Value=No}}
    
    PS \> $json[0][0]
    
    ItemName  : A
    ItemID    : I001
    ItemDate  : 2021-03-01
    ItemValue : 1000
    ItemTags  : {@{Name=Tag 1; Value=medium}, @{Name=Tag 2; Value=red}, @{Name=Tag 3; Value=}, @{Name=Tag 4; Value=Yes}}
    

    编辑 2

    $jsonFiles = Get-ChildItem "C:\temp" -File -Filter *.json
    
    $result = foreach($json in $jsonFiles)
    {
        $content = Get-Content $json -Raw | ConvertFrom-Json
        
        foreach($element in $content)
        {
            $tag4 = $element.itemtags.where({$_.Name -eq "Tag 4"}).Value
    
            [pscustomobject]@{
                ItemName = $element.ItemName
                ItemID = $element.ItemID
                ItemDate = $element.ItemDate
                ItemValue = $element.ItemValue
                Tag4 = $tag4
            }
        }
    }
    
    $result | Export-Csv "C:\temp\items.csv" -NoTypeInformation
    

    【讨论】:

    • 谢谢,但这并没有真正起作用,我没有从输出中得到任何值,只是列标题。
    • @wd510 我想我知道为什么会发生这种情况,所有 JSON 文件看起来都像你的问题吗?因为那个 JSON 正在创建一个包含 2 个项目的数组。有关详细信息,请参阅我的编辑。
    • 不确定我是否完全理解,但是是的,所有 json 文件看起来都像我发布的那样,其中 ItemTags 值的嵌套数组。
    • @wd510 我的意思是,你看到每个 JSON 有 2 个元素吗,就像在我的例子中,你可以看到 $json 变量有 2 个元素,一个元素是 ItemName = A第二个是ItemName = B
    • 这很好,感谢您的努力
    猜你喜欢
    • 2018-03-18
    • 2018-01-15
    • 2019-04-09
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2023-03-12
    • 2013-10-24
    相关资源
    最近更新 更多