我有一个读取json并返回结果集的过程。如果工作表中有错误,我希望它们与工作表名称一起返回。
我的代码有效,但最终将所有工作表名称分组在一起,给我不一致的结果
$jsonFilePath = '{
"stores": [
{
"storename": "Target",
"files": [
{
"sheets": [
{
"name": "INVENTORY",
"errors": [
"Multiple header rows found on sheet: INVENTORY", "Invalid data in field name: STARBUCKS"
],
"locations": []
},
{
"name": "SITE ADD",
"locations": []
}
],
"name": "TARGET INVENTORY.xlsx",
"fileId": "ff2087de-52eb-4d5a-be16-3dfa53598766",
"status": "failed"
}
]
}
]
}'
$json = $jsonFilePath | ConvertFrom-Json
<#$error_result = #>
$json.stores | foreach-Object {
foreach ($File in $_.files)
{
[PSCustomObject]@{
storename = $_.storename
SheetErrors = ($File.sheets.errors -join ' | ')
SheetName = $File.sheets.name
fileId = $File.fileId} | Where-Object {$File.sheets.errors -ne $null}
}
}
哪个返回此结果。 SITE ADD工作表名称不应显示,因为该工作表上没有错误:
storename SheetErrors SheetName fileId
--------- ----------- --------- ------
Target Multiple header rows found on sheet: INVENTORY | Invalid data in field name: STARBUCKS | {INVENTORY, SITE ADD} ff2087de-52eb-4d5a-be16-3dfa53598766
这就是我要寻找的:
storename SheetErrors SheetName fileId
--------- ----------- --------- ------
Target Multiple header rows found on sheet: INVENTORY | Invalid data in field name: STARBUCKS | INVENTORY ff2087de-52eb-4d5a-be16-3dfa53598766
我只想返回任何有错误的工作表名称。我想让这项工作失去什么?
答案 0 :(得分:1)
问题是$File.sheets.name
无条件枚举了所有工作表名称,而您只希望有错误的工作表名称。
因此,替换:
SheetName = $File.sheets.name
具有:
SheetName = ($File.sheets | Where-Object errors).Name
请注意,使用隐式到布尔型转换来检测(非空).errors
属性的存在。
在代码的上下文中,应用了另一项优化,以避免两次访问$File.sheets.errors
:
$json.stores | Foreach-Object {
foreach ($File in $_.files) {
if ($errs = $File.sheets.errors) {
[PSCustomObject]@{
storename = $_.storename
SheetErrors = $errs -join ' | '
SheetName = ($File.sheets | Where-Object errors).Name
fileId = $File.fileId
}
}
}
}