简体   繁体   English

Powershell ConvertFrom-Json 循环多个文件到 Output 到 CSV

[英]Powershell ConvertFrom-Json Loop Through Multiple Files to Output to CSV

I have a folder with dozens of json files that I output to csv via powershell.我有一个文件夹,里面有几十个 json 文件,我通过 Z2F2D399F0EA88447859FE5514B output 到 csv 文件All the json files have the same format.所有 json 文件具有相同的格式。 My current powershell script is defining each file one by one by the file name, selecting various values and outputting it to the same csv.我当前的 powershell 脚本是通过文件名一个一个地定义每个文件,选择各种值并将其输出到同一个 csv。

How do I modify the powershell script so that it simply goes through each file in the folder without having to define each one by its file name specifically?如何修改 powershell 脚本,以便它简单地遍历文件夹中的每个文件,而不必专门通过文件名定义每个文件?

Each json's content is like this:每个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"
         }
      ]

Here's a sample of the powershell.这是 powershell 的示例。 How do I modify it so goes through the C:\temp folder and do the same output for each file without the -Path part needing to be specified with the file name?如何修改它,以便通过 C:\temp 文件夹并对每个文件执行相同的 output 而不需要使用文件名指定 -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

Try with this:试试这个:

$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

Edit编辑

I reproduced the JSON from your example, if all JSONs look like this let me know and I'll edit my code.我从您的示例中复制了 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}}

Edit 2编辑 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM