PowerShell生成CSV时如何为未匹配项保留空值?
解决PowerShell遍历数组匹配CSV时保留空值的问题
你的问题在于原代码中,当数组元素在CSV的A列找不到匹配项时,Where-Object不会产生任何输出,导致最终的$vendorname数组缺少对应位置的元素。要实现未匹配项保留空值的需求,需要确保每个数组元素都对应一个输出值,匹配到则取B列值,未匹配则输出空字符串。
修改后的代码
$CSV = Import-Csv C:\tmp\mac-vendors-export.csv -Delimiter ';' $vendormacarray = $Vendormac $vendorname = foreach ($UniqueVendorMac in $Vendormacarray) { # 查找当前数组元素对应的CSV行,只取第一个匹配结果 $matchedRow = $csv | Where-Object {$_.A -eq $UniqueVendorMac} | Select-Object -First 1 # 有匹配则输出B列值,无匹配则输出空字符串 if ($matchedRow) { $matchedRow.B } else { '' } }
更简洁的写法(PowerShell 7+支持)
利用??空值合并操作符,可以一行完成取值判断:
$CSV = Import-Csv C:\tmp\mac-vendors-export.csv -Delimiter ';' $vendormacarray = $Vendormac $vendorname = foreach ($UniqueVendorMac in $Vendormacarray) { ($csv | Where-Object {$_.A -eq $UniqueVendorMac} | Select-Object -ExpandProperty B -First 1) ?? '' }
关键说明
-eqvs-match:如果你的需求是精确匹配A列内容,用-eq比-match更合适(-match是正则表达式匹配,可能会出现意外匹配)。如果确实需要正则匹配,可以保留-match。Select-Object -First 1:避免CSV中出现重复A列值时返回多个结果,确保每个数组元素只对应一个输出值。- 强制输出空字符串:通过
else { '' }或?? ''确保即使没有匹配项,也会向$vendorname数组添加一个空元素,保证结果数组长度和原数组一致,空值位置保留。
内容的提问来源于stack exchange,提问作者dpj
相关产品推荐
相关产品推荐

